开发环境 cocos2d-quick-3.3final (android)版本。
现象: 游戏通过百度多酷接入了微信支付,阿里支付,以及短信支付。其他两个正常,但调用微信支付之后,就卡死不动了,良久之后,系统判断app不响应,弹出结束对话框
详细说明: 查找后发现是由于游戏是横屏的,而微信支付是竖屏的,从 App 进入微信支付,然后在返回App的情况下,出现旋转,引起Activity销毁而后 重新创建引发的。
当屏幕旋转时,当前显示的Activity需要被重建,Activity对象会被终止,它的onPause()、onStop()和onDestroy()方法依次触发。流程图如下
、当支付完成之后,微信支付返回App,这时候当前的Activity 则会重建,
之前接入百度的多酷sdk ,在 已经销毁的 Activity 中已经重新创建,把Activity 的指针传给了 sdk,而重新构建之后,Activity已经不同,sdk 中保存的activity 已经是空指针,于是引发了app不响应最后*退出的问题
定位问题之后,就容易解决了
尝试解决:
1.既然在onCreate 中传入的activity(其实是 Context)的指针,而引发问题的是 activity的指针为空了。那么在 activity的销毁后重建时,传入新的activty 指针不久好了。尝试后发现明显不可行,这个sdk是要求保证app启动的时候初始化一次的。重新初始化会引发乱七八糟的异常,即使通过各种方案,重新初始化成功,那用户体验也糟糕的没法看。(启动了一个小广告,支付完成回来一个小广告,那个度娘的节操我们都懂)。
2. 有没有办法让他每次不在走销毁和重新构建的流程呢。搜索了一下,发现是有的(怨自己对android不是太熟悉)。如果activity希望保留而不需要下回的话,只需要在 Mainifest.xml 中 配置一下就好
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
但在自己的mainfest 中搜索发现,默认的cocos2dx 创建工程的时候已经配置好了。那么问题在哪里呢。
在这里:
简单说就是,把配置修改一下,改成
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name">
就解决了(cocos2dx 的版本比较老,当时考虑加入这个属性?),当进入微信支付的时候,之前的Activity不会销毁,也就不会引发后来的一切问题。返回的时候正常进行游戏,效果一切ok。。
最终解决了,仅仅添加了一个属性而已