解决了,因为是要嵌入原生应用的,而大家一贯做法是把首页设成singleTask,所以,返回首页的时候,游戏页面会被销毁,所以只是更改游戏页面的launchmode是没用的,目前可能存在一些内存释放不完全的问题,不过总算是解决了游戏嵌入应用的问题,如果有更好的处理方法欢迎联系我samgan@beva.com,以下是我的解决方法:
我的cocoscreator 版本是1.6.2,所以代码有出入的话酌情处理吧
首先在Cocos2dxActivity的onCreate方法中注释以下代码
if (!isTaskRoot()) {
// Android launched another instance of the root activity into an existing task
// so just quietly finish and go away, dropping the user back into the activity
// at the top of the stack (ie: the last state of this task)
finish();
Log.w(TAG, “[Workaround] Ignore the activity started from icon!”);
return;
}
不知道啥原因,源码里头居然有这种代码,坑的我好惨,不是首页为啥要给finish呢,就不能好好找问题解决么!
然后,在main.cpp中添加一个释放资源的方法:
void cocos_android_app_destroy () {
ScriptingCore::getInstance()->cleanup();
JniMethodInfo mFinishSelf;
JniHelper::getStaticMethodInfo(mFinishSelf, "org/cocos2dx/lib/Cocos2dxActivity", "finishSelf", "()V");
mFinishSelf.env->CallStaticVoidMethod(mFinishSelf.classID, mFinishSelf.methodID);
}
在CCDirector里头添加以下代码
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,VA_ARGS)
void cocos_android_app_destroy ();
#endif
在mainloop方法中做如下修改
void Director::mainLoop()
{
if (_purgeDirectorInNextLoop)
{
_purgeDirectorInNextLoop = false;
purgeDirector();
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
cocos_android_app_destroy ();
#endif
}
… …
然后由于第二次启动游戏页面后再次设置GL一些属性会报错,所以这里在void Director::setGLDefaultValues()方法中添加以下代码:
void Director::setGLDefaultValues()
{
static bool inited = false;
if (inited) return;
inited = true;
… …
另外,为了下次进入能重启director,在void Director::purgeDirector()方法末尾添加:
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
Director *tmp = s_SharedDirector;
s_SharedDirector = nullptr;
delete tmp;
#endif
最后,在游戏里头添加返回键监听:
onLoad: function () { cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this); },
onKeyUp: function (event) { switch (event.keyCode) { case cc.KEY.back: this.endGame(); break; } },
endGame: function () { cc.director.end(); },
这些改完了的话应该就ok了,
大体上流程是:
第一次在游戏里头点击返回键 (此处省略其他各种方法的调用): cc.director.end() --> mainloop () --> cocos_android_app_destroy() --> 返回了上个页面
第二次进入(此处省略其他各种方法的调用):Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit --> director init --> Director::setOpenGLView --> Director::setGLDefaultValues(由于是第二次启动所以这次不会走里边的代码) --> applicationDidFinishLaunching (游戏重新启动了)