项目中最近在做一个 AR 扫行标(银行 Logo)抽奖的活动,动画模型依托 Unity 环境来展现的。Android 集成 Unity 很简单(比 iOS 方便太多),但是在使用过程中还是需要到一点小麻烦。
需求中要求扫描页面可以反复进出,在 @Override protected void onDestroy ()
生命周期的回调方法中需要调用 mUnityPlayer.quit();
来达到退出 Unity 的目的。但是发现 mUnityPlayer.quit();
方法会杀死当前进程,不调用 mUnityPlayer.quit();
方法,控制台中又会提示一个服务没有被清理,会发生内存泄漏,网上的做法是集成 UnityPlayer
写一个新类,重写掉 kill()
方法,不杀死进程,但是实验了之后发现没有效果,依然会有内存泄漏的提示,虽然大部分机型可以正常使用,但是测试中小米和其他品牌的部分机型在反复进出几次 Unity 程序后,会闪退。
最后的解决办法是,在另一个进程中启动 UnityPlayerActivity
,mUnityPlayer.quit();
方法杀死当前子进程,而不影响主进程。
<activity
android:name="cn.com.global_vision_ar.UnityPlayerActivity"
android:screenOrientation="portrait"
android:process=":unityAR"
</activity>
这个办法解决了闪退问题,但是还没有结束,UnityPlayerActivity
中需要接收 AR 程序的回调方法,如:public void getGift()
,在这个方法中请求后台接口,发起抽奖。Unity 程序改成用新进程启动后,发起抽奖接口时,发生了会话丢失的情况(抽奖是需要登录的,后台会话是基于 Cookie 中的 JessionId)。我猜是因为不在同一个进程,Cookie 没有同步,导致送到后台的 JessionId 不一致(不是登录成功后返回的 JessionId)。
解决办法是使用 Broadcast
跨进程通信,把抽奖的请求写在主进程,要抽奖时发起广播进行抽奖,抽奖结束后得到抽奖结果的数据,再通过广播的方式把数据传回 UnityPlayerActivity
,使用 UnityPlayer.UnitySendMessage
方法通知 Unity 程序。