做Antutu评测的时候,之前都是将3D部分作为一个APP进行跑Unity 3D部分,但是用户开始谩骂说怎么还要装个3D,哎,中国用户不是你做个免费的软件让他用他就觉得很爽了,他们要的是没有广告、没有崩溃、运行非常流畅等,都是高级别的要求。跑题了,这样一来,产品就开始舔用户了,说要把3D部分合到一个APP里。毕竟我也是半路进来的,不是太了解,觉得应该没有问题吧,实际上还是出现了很多意想不到的问题,其中Unity执行mUnityPlayer.quit() 导致APP退出,就是问题之一。、
那尝试了很多种方案,不过觉得只有一种方案比较合理,那就是将UnityPlayerActivity放到一个新的进程里,因为执行mUnityPlayer.quit()就会将Application进程给杀掉,这个Unity性质决定的,目前暂时官方没有给出合理的方案。
你可以查看源码后,会发现UnityPlayer.quit()里的kill()
protected void kill() {
Process.killProcess(Process.myPid());
}
我滴神呀,直接干死自己所在的进程,Unity真是简单粗暴啊,不过也只有这样才能彻底释放资源。
方案:
首先,把UnityPlayer所在的Activity放到一个新的进程里。
加入android:process=":unity"
<activity
android:name=".UnityPlayerActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:process=":unity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
</activity>
接下来,按照下面步骤进行:
第一步,在activity里定义一个unityFinish方法。
第二步,在unity脚本中调用activity里定义好的unityFinish方法。(如不知道怎么调用请移步到:Android 与 Unity 的交互)
第三步,activity的unityFinish方法里处理一些结束操作,最后调用Activity的finish()。
第四步,在activity的destroy方法里调用UnityPlayer的quit()。
这样你需要进行结束要处理的事情放到了自己定义的方法里进行了处理,处理完后调用Activity的finish(),这样activity开始走自己结束的方法,在Activity的的destroy方法里调用super.onDestroy()之前调用mUnityPlayer.quit(),这个时候会先走UnityPlayer的quit()处理后事,这样即使把自己的宿主进程kill了,用户也感知不到了。
How do i stop mUnityPlayer.quit() closing the entire android app?
如果,你有更好的方案可以告诉我哦。
文章评论
不错,解决了我的问题
Me enjoying, will read more. Thanks!
I am just starting to learn about all of this. Thanks!