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\" />  

如有错误,欢迎指正

 

 

 

人已赞赏
站长资讯

多线程学习笔记九之ThreadLocal

2020-11-9 3:45:45

站长资讯

Angular过滤器

2020-11-9 3:45:47

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索