问题:目前引擎在Activity的onPause时调用Cocos2dxHelper.onPause()和 mGLSurfaceView.onPause()暂停渲染,在onResume时恢复。这样遇到一个问题,当弹出权限权限申请对话窗口或其它第三方SDK界面时,如果切换到后台再切回来,游戏会黑屏。
=========================================
通过Log研究activity各生命周期函数的调用顺序:
1.正常情况下切换后台、前台,activity各生命周期函数的调用顺序是:
前台到后台:onPause -> onStop
后台到前台:onRestart -> onStart -> onResume
2.当弹出权限权限申请对话窗口或有其它sdk界面存在时(其余activity):
前台到后台:onStop
后台到前台:onRestart -> onStart
=========================================
为解决这个问题,我把暂停和恢复渲染的逻辑移动到生命周期的onStop和onStart函数中(Cocos2dxActivity.java):
1.注释掉原来onPausu和onResume中相关的逻辑:
@Override
protected void onPause() {
Log.d(TAG, "onPause()");
super.onPause();
//Cocos2dxAudioFocusManager.unregisterAudioFocusListener(this); //!@
//Cocos2dxHelper.onPause();
//mGLSurfaceView.onPause();
}
@Override
protected void onResume() {
Log.d(TAG, "onResume()");
super.onResume();
//Cocos2dxAudioFocusManager.registerAudioFocusListener(this); //!@ 进游戏不关闭后台音乐
//this.hideVirtualButton();
//resumeIfHasFocus();
}
2.在onStop和onStart中添加原来的逻辑
@Override
protected void onStart() {
super.onStart();
//注意,这个时候activity没有获得焦点,所以不用原来的resumeIfHasFocus()方法,直接执行相关功能逻辑
this.hideVirtualButton();
Cocos2dxHelper.onResume();
mGLSurfaceView.onResume();
}
@Override
protected void onStop() {
super.onStop();
Cocos2dxHelper.onPause();
mGLSurfaceView.onPause();
}
=========================================
这样修改后,目前测试能解决黑屏问题,游戏运行各方面【似乎】也都正常,但个人对Activity的生命周期理解还不是很深入,请问大佬们:
【这样做有什么潜在的危险吗?】
跪求解答~~
