UnityActivity与普通Android Activity数据通信

此次本以为一个简单的传值通信却研究了2天才找出最终解决方案,实在是丢脸,本次传值发生在Unity3D的UnityActivity里面,,通常我们做法是使用

/**
*BaiduMapUnity 为场景的对象名
*GetContainer  为场景脚本里面执行的方法
*json 为传递的json字符串
*/
UnityPlayer.UnitySendMessage("BaiduMapUnity", "GetContainer",json)  以下就简称sendMsg

本来以为简简单单调用这个方法就可以万无一失,谁知道在传值过程中遇到很多麻烦,反正就是传不过去,没有调用方法,经过探索发现以下几点:

  • sendMsg方法不会在原生Activity里面即时产生效果,如果多次发送,消息会暂存入一个栈中,待回到UnityActivity时才会开始按顺序调用。
  • 传值时不能使用StartActivity进入新UnityActivity实例;你可以测试下,sendMsg时Activity栈中必要有一UnityActivity实例,而每次跳转时这个UnityActivity会进行新实例,至于UnityActivity是新创建对象并销毁栈中同类已有对象还是两者都保留,目前没做探究,只是这次传值必然会失效,伴随着界面的体现就是能看到Unity的默认过度动画然后是作者制作的Unity界面。
    但是话说回来其遵循部分Android规则,可以在清单文件中配置singleTask,理论上如此UnityActivity不会创建新的实例,直接栈中在其上面的所有Activity实例撸掉,这时候发送的话栈中有实例且startActivity后依旧是前面的UnityActivity实例所以会奏效,但是这个结论不作确定,因为没弄明白其为何仍然会走onCreate方法,还有一种使其奏效方式即msgSend 并立即finish掉当前原生Activity进入UnityActivity,使之进入活动状态,这会立即显现效果,所以我一直觉得singleTask在源码处理时会跟finish有重叠区域。
    综合来看就是UnityActivity在栈中不能出现第二个实例化,否则此次发送数据无效,还有finish与singleTask方法我觉得不太稳定,因为如果遇到内存泄漏原生Activity并不能轻松的结束掉,所以效果可能会失常,这在稍微大点的工程里很容易出现,不管你是几年的安卓,不会处理内存泄漏就是会发生。
  • 由于UnityActivity我单独开了一个进程,所以每次跳转时其若初始化,则整个应用多个进程内存中的全局变量、静态变量之类的临时数据重置为定义时的值(注意是进程,不是线程,不知道的先去百度如何给组件指定进程),所以以下Unity调android的方法别想了,Unity拿不到返回值,你也没数据可以传,所以这个其实就是Unity给Android自己处理的一个小信号,根本不是数据通信,还是隔离的
  • 别幻想开个Service使用定时任务,因为在其只有一个UnityActivity实例且处于运行状态时我测试是可以的,一旦发生了跳转,就好像整个App多个进程都被重启,Service即刻失效,当然这个解释可能不对,但是我也不知道发生的什么,sendMsg不知是否支持跨进程通信,但是其本质是一个JNI接口,插件开发是对外开放的。
 //注解1
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
        using (AndroidJavaObject jo = jc.GetStatic("currentActivity")) {
                //调用Android插件中UnityTestActivity中StartActivity0方法,stringToEdit表示它的参数
                jo.Call("tostMsg", "啊~~~~~~~");//tostMsg为安卓方法名
            }
        }
较为适合解决方案:
  1. Shareprefrence,数据量小使用,UnityActivity和原生都能读取和更改,写过工具类注意过滤高并发就行,遵循原则为Android写,Untity读,Untity默认读默认值做个判断就行,在其Awake实例化时执行获取或者等所有脚本都执行完Start中获取我觉得都没毛病,但是这里有个坑在Unity4的时候,PlayerPrefs会将数据直接进行存储,在Unity5中,数据存储时会先进行一步Url编码,比如key或value值中含有“=”号的,在存储时会被编码为%3D,因此,要做到Unity4的向上兼容,数据的编码解码也要考虑进去,经过实际查看其现在保存文件名为com.biabia.club.v2.playerprefs。
    详解链接:https://www.cnblogs.com/wayland/p/6206724.html
    2.服务器中转适合大量数据存储,
    3.自定义插件

你可能感兴趣的:(UnityActivity与普通Android Activity数据通信)