zoukankan      html  css  js  c++  java
  • 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安装目录比如unity2017EditorDataPlaybackEnginesAndroidPlayerApk中,有一个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" />
     

    如有错误,欢迎指正

  • 相关阅读:
    GoLang中面向对象的三大特性
    Go常用功能总结一阶段
    GO语言基础之并发concurrency
    GO语言基础之error
    GO语言基础之reflect反射
    GO语言基础之interface
    GO语言基础之method
    GO语言基础之struct
    GO语言基础map与函数
    GO语言基础条件、跳转、Array和Slice
  • 原文地址:https://www.cnblogs.com/IAMTOM/p/10525577.html
Copyright © 2011-2022 走看看