【已解决】cocos2d-x 3.0 startActivity打开新的activity导致AppActivity闪烁,黑屏bug

因为游戏里要做上传自定义头像,所以调用了java的api。大家都知道cocos2dx在安卓平台显示的activity为AppActivity.java。
然后我在AppActivity用这段代码打开本机图库:

Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(i, ACTIVITY_PICKLOCAL);

```

这时会弹出一个非全屏的浏览图库框。但同时屏幕会闪烁,变黑。
有哪位大神遇到过这个问题吗?同样的代码如果写在一个示例安卓项目里就不会闪烁黑屏。难道这是cocos2dx的bug?:3:

这个论坛好冷清啊。想不出居然是cocos2d官方论坛。

不太确定原因,但是看了下源代码,有如下感觉,供楼主参考:
AppActivity是继承自Cocos2dxActivity。Cocos2dxActivity的onCreate函数调用了init函数,在init函数中调用了我们android熟悉的setContentView方法,参数为mFrameLayout。同时在init函数中还将edittext和mGLSurfaceView加入了mFrameLayout。mGLSurfaceView是用来cocos2dx做绘制使用的。
综上所属,我觉得如果楼主想要添加些android原生控件,我猜测是不是应该从这里下手。

+关注本帖

首先,感谢你的回复~
其次,下面代码

Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(i, ACTIVITY_PICKLOCAL);

```

应该是打开了一个安卓预定义的activity,然后把AppActivity给pause了。
下面的事情,我就不知道如何修改了

楼主是在应用程序刚启动的时候就调用了这个函数么?是不是应用程序还没有绘制?
看了下源代码,在cocos2dxRender.java的类Cocos2dxRenderer的handleOnPause方法会先判断mNativeInitCompleted是否为true,如果不为true就不会pause,而mNativeInitCompleted默认是false的,只有在surface创建成功的时候才会设置为true
所以楼主试下将handleOnPause的如下两行代码删掉试试?
if (! mNativeInitCompleted)
return;

可能是这个问题,参考这个Commit。新版本已经fixed。

https://github.com/cocos2d/cocos2d-x/commit/23b7d7679711f285df7a2850656991784e269c47

追踪了下源码。AppActivity onPause方法执行后发生了如下事情:
Cocos2dxActivity.onPause -> Cocos2dxGLSurfaceView.onPause -> Cocos2dxRenderer.handleOnPause -> Cocos2dxRenderer.nativeOnPause
-> java_org_cocos2dx_lib_Cocos2dxRenderer.cpp.nativeOnPause -> Application::getInstance()->applicationDidEnterBackground()
-> Director::getInstance()->stopAnimation()
估计就是因为这个原因吧~

现在把这个问题解决了。
我把Cocos2dxActivity.java里的onPause方法改成如下:

protected void onPause()
{
    super.onPause();
    if(如果是打开选择图片的intent)
    {
        return;
    }
    Cocos2dxHelper.onPause();
    this.mGLSurfaceView.onPause();
}

```

估计问题出现在该方法的后两句了。

赞,解决就好!