unity与安卓通讯的一些事儿
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” />
如有错误,欢迎指正
版权声明:本文为IAMTOM原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。