如何实现:
1、使用cocos2dx 3.17.2版本,创建一个最简单的JS工程。
2、在app.js里创建一个webview,然后随便打开一个网页。最简单的空网页都可以。
3、点返回按钮,如果是全面屏则是从右侧屏幕边缘划入。
4、某些手机,多试步骤3几次,崩溃;某些手机需要关闭webview后,再试步骤3,必死。
@panda 请引擎组同学帮忙看看吧?
因为我们是从一开始就使用的cocos2djs版本的项目, 这次终于没有忍耐住,将版本升到了3.17.2(之前是3.15.1)。
因为这个问题,导致项目只能回撤到老版本。
另外,不用creator的原因就是:我们的工具链和代码库都是基于cocos2djs开发的,且是做原生APP,暂时没可能切换到creator.
问题原因:
该问题是由于WebView被移除或隐藏时,Cocos2dxGLSurfaceView没有及时获得焦点,导致被系统杀掉。
解决方案:
修改Cocos2dxWebViewHelper.java的两个方法:
removeWebView和setVisible:
public static void removeWebView(final int index) {
sCocos2dxActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Cocos2dxWebView webView = webViews.get(index);
if (webView != null) {
webViews.remove(index);
sLayout.removeView(webView);
}
// 修复WebView销毁之后点击返回键崩溃的bug 这段来自于 https://forum.cocos.org/t/cocos2d-x-webview/93592
boolean isHaveVisibleWebView = false;
for (int i = 0; i < webViews.size(); i++) {
if (webViews.get(i).getVisibility() == View.VISIBLE) {
isHaveVisibleWebView = true;
break;
}
}
if (!isHaveVisibleWebView) {
Cocos2dxGLSurfaceView.getInstance().requestFocus();
}
}
});
}
public static void setVisible(final int index, final boolean visible) {
sCocos2dxActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Cocos2dxWebView webView = webViews.get(index);
if (webView != null) {
webView.setVisibility(visible ? View.VISIBLE : View.GONE);
}
//下面代码就是修复问题的关键
if(webView.getVisibility()==View.GONE){
Cocos2dxGLSurfaceView.getInstance().requestFocus();
}
}
});
}