1,unity 与安卓通讯的两种方法:
第一种是 unity 导出安卓工程, 在 unity 的 BuildSetting 窗口可以将 unity 工程导出为安卓工程, 然后再用 Eclipse 或者 Android Studio 打开, Eclipse 目前已经被放弃了, 现在安卓开发都用 Android Studio, 然后写完通讯业务, 再由 Android Studio 导出 apk; 第二种方法是在 Android Studio 中创建一个 Module, 将通讯接口写在这个 Module 里面, 再导出 jar 包, 将这个 jar 包以及 manifest 文件导入 unity 工程面板, 放在 Plugins/Android 文件夹下, 供 unity 调用. 我们通常使用第二种方法.
2,unity 如何调用安卓
- public class UnityCallAndroid:MonoBehaviour{
- private AndroidJavaClass ajc;
- private AndroidJavaObject ajo;
- // Use this for initialization
- void Start () {
- ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
- ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity");
- }
- // 调用安卓方法
- public void callAndroid()
- {
- ajo.Call("broadcast");// 参数是方法名, 可以带参数, 可以有返回值
- }
- }
3, 安卓如何调用 unity
- public class Main2Activity extends UnityPlayerActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
- // 调用 unity
- public void callUnity(String obj,String func,String params)
- {
- // 第一个参数是挂载脚本的 gameobject, 第二个参数是方法名, 最后是方法参数
- UnityPlayer.UnitySendMessage(obj,func,params);
- }
4, 需要注意的事
首先, Android Studio 导出 jar 包时, 需要配置好对应的 manifest 文件, 注意包名, 最小支持的 API Level 和 target API Level 需要与 unity 中的 Player Setting 中的设置保持一致, 其实 unity 在导出 apk 时也会有一份 manifest 文件, 在 unity 安装目录比如 unity2017\Editor\Data\PlaybackEngines\AndroidPlayer\Apk 中, 有一个 unity 的默认 AndroidManifest 文件, 在你导出 apk 时, unity 会复制一份该 manifest 文件, 然后根据 playerSetting 上的设置来修改该 manifest, 注意多个 manifest 文件的冲突; 另外, 需要安装好对应的 Android sdk 版本, 不然导出时会报错.
5,unity 如何发送接收安卓广播
安卓广播机制就是在安卓中, 有一些操作完成以后, 会发送广播, 如果某个程序接收了这个广播, 就会做相应的处理. 这个广播机制是由安卓操作系统提供的, 广播需要有发送者和接收者, 在发送者中, 可以这样写这样一个 java 方法供 unity 调用:
- // 发送广播
- public void broadcast(String name,String content)
- {
- Intent intent=new Intent();
- intent.setAction(name);// 广播的名字
- intent.putExtra("content",content);// 指定广播内容
- sendBroadcast(intent); // 发送广播
- }
在接收广播之前, 我们需要注册一个广播, 而注册分两种: 静态注册, 动态注册, 静态注册是将需要监听的广播写进 manifest 文件中, 动态注册则是在代码中注册, 比如:
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- intentFilter=new IntentFilter();
- actionName="";
- intentFilter.addAction(actionName);
- msgListener=new MsgListener();
- registerReceiver(msgListener,intentFilter);
- }
接收广播就必须写一个类继承 BroadcastReceiver:
- // 广播监听类
- class MsgListener extends BroadcastReceiver
- {
- @Override
- public void onReceive(Context content, Intent intent)
- {
- String action=intent.getAction();
- if (actionName.equals(action))
- {
- String msg=intent.getStringExtra("content");
- Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
- }
- }
- }
6,unity 如何接收到广播后从后台切换到前台
- @Override
- public void onReceive(Context content, Intent intent)
- {
- String action=intent.getAction();
- if (actionName.equals(action))
- {
- String msg=intent.getStringExtra("content");
- Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
- // 后台到前台
- Intent inten = new Intent("android.intent.action.MAIN");
- inten.setComponent(new ComponentName(getApplicationContext().getPackageName(), Main2Activity.class.getName()));
- intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
- | Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- getApplicationContext().startActivity(inten);
- }
- }
按上面这种方法, 每次都会重启该 Activity, 如果只想单纯的从后台切换到前台, 可以使用 singleInstance 的方式, 只需在 manifest 文件中加入 Android:launchMode="singleInstance" 即可
7,unity 安卓程序如何保活 (减小被安卓系统杀死的几率)
普通的程序无法像微信这种大佬一样直接加入白名单, 那么如何做 App 进程的保活呢, 方法有很多, 一是启动前台 Service, 伴随着 Notification(通知栏), 系统会默认给进程高优先级, 第二种是使用两个进程互相守护, 如果其中一个进程监测到另一个进程被杀死, 马上拉起它, 第三种是一像素保活, 很流氓的方法, 但也很有效, 就是在手机黑屏时创建一个透明像素的 Activity, 亮屏时就关闭. 方法有很多, 我暂时用过的只有是第一种, 其他还没试过. Service 写法是这样:
- public class MyService extends Service
- {
- /** 标识服务如果被杀死之后的行为 */
- int mStartMode;
- /** 绑定的客户端接口 */
- IBinder mBinder;
- /** 标识是否可以使用 onRebind */
- boolean mAllowRebind;
- /** 当服务被创建时调用. */
- @Override
- public void onCreate() {
- super.onCreate();
- }
- /** 调用 startService() 启动服务时回调 */
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- return 0;
- }
- /** 通过 bindService() 绑定到服务的客户端 */
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
- /** 通过 unbindService() 解除所有客户端绑定时调用 */
- @Override
- public boolean onUnbind(Intent intent) {
- return mAllowRebind;
- }
- /** 通过 bindService() 将客户端绑定到服务时调用 */
- @Override
- public void onRebind(Intent intent) {
- }
- /** 服务不再有用且将要被销毁时调用 */
- @Override
- public void onDestroy() {
- super.onDestroy();
- }
最后, 在 manifest 文件中加上:<service Android:name=".MyService" />
如有错误, 欢迎指正
来源: https://www.cnblogs.com/IAMTOM/p/10525577.html