一、 问题现象
当有其他Activity在Unity所在的Activity之上的时候,Unity游戏从后台返回到游戏时,会出现黑屏的现象,比如:
正常时:
从后台返回时:
二、 问题分析
1)当Unity所在的Activity之上没有其他Activity时候,生命周期的变化如下:
启动App
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
D/MainActivity: onWindowFocusChanged true
点Home进入后台
D/MainActivity: onPause
D/MainActivity: onWindowFocusChanged false
D/MainActivity: onStop
从后台回来
D/MainActivity: onRestart
D/MainActivity: onStart
D/MainActivity: onResume
D/MainActivity: onWindowFocusChanged true
退出应用
D/MainActivity: onWindowFocusChanged false
D/MainActivity: onPause
D/MainActivity: onStop
D/MainActivity: onDestroy
2)当Unity所在的Activity之上有其他Activity有其他Activity时候,生命周期的变化如下:
弹窗显示另外一个Activity
D/MainActivity: onPause
D/MainActivity: onWindowFocusChanged false
点Home进入后台
D/MainActivity: onStop
从后台回来
D/MainActivity: onRestart
D/MainActivity: onStart
关闭 弹窗Activity
D/MainActivity: onResume
D/MainActivity: onWindowFocusChanged true
3)对比两次的日志打印,我们可以发现:第二次从后台返回少了两个生命周期的调用
D/MainActivity: onResume
D/MainActivity: onWindowFocusChanged true
4)综上分析所得,要想做到从后台返回不黑屏,要么游戏自己得去处理好,从后台返回时,游戏内容的恢复;要么就是在Android层面上,手动加调用onResume,onWindowFocusChanged
三、 解决方案
对Unity提供的class.jar
进行反编译,然后在UnityPlayerActivity类中的onStart
方法中增加调用onResume,onWindowFocusChanged
,经测试,确实是解决了黑屏的问题。不过最好的解决方法还是游戏方去处理,这个会影响到unity的正常生命
public void onStart() {
super.onStart();
this.mUnityPlayer.resume();
onWindowFocusChanged(true);
}