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 ;
} /** 通过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" />
 

如有错误,欢迎指正

上一篇:favicon.ico的制作


下一篇:C++中的const详解