Android WebView销毁后快速重启Activity时游戏提示会话已在其他窗口打开的问题
Android WebView销毁后快速重启Activity时游戏提示会话已在其他窗口打开的问题
这个问题我之前也碰到过类似的场景,核心原因其实是WebView的销毁并不是「立即完成所有清理」的——哪怕你在onDestroy()里调用了webView.destroy(),底层的网络连接、和游戏服务器绑定的会话标识可能还没来得及彻底断开,服务器那边会误以为旧的会话窗口还在活跃,所以快速重启Activity时就会弹出会话冲突的提示。
给你几个亲测有效的解决思路,你可以挨个试试:
提前在生命周期早期做WebView的暂停与清理:不要等到
onDestroy()才动手,在onPause()里就先切断WebView的运行状态:- 先调用
webView.stopLoading()停止当前加载 - 再调用
webView.onPause(),这个方法会暂停WebView的所有布局、解析和JavaScript执行,包括Flash插件的运行,能提前终止游戏的会话连接 - 还可以加上
webSettings.setJavaScriptEnabled(false),彻底禁用脚本执行
- 先调用
完善WebView的销毁流程:只调用
webView.destroy()有时候不够彻底,得先把它从父布局中移除再销毁:// 假设webView的父布局是parentLayout if (webView.getParent() != null) { ((ViewGroup) webView.getParent()).removeView(webView); } webView.loadUrl("about:blank"); webView.clearCache(true); webView.clearHistory(); webView.destroy();先移除父布局是为了避免WebView还持有布局的引用,导致资源无法及时释放;加载空白页+清理缓存历史,能进一步切断和旧会话的关联
清理WebView的Cookie会话:游戏的会话通常是通过Cookie来标识的,销毁时主动清理所有Cookie,让重启后的WebView重新获取新的会话:
CookieManager cookieManager = CookieManager.getInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.removeAllCookies(null); } else { cookieManager.removeAllCookie(); } cookieManager.flush();flush()方法能确保Cookie的清理操作立即写入磁盘,不会残留尝试让WebView在独立进程运行:在AndroidManifest.xml里给承载WebView的Activity指定单独进程:
<activity android:name=".YourGameActivity" android:process=":game_webview_process" />这样当Activity销毁时,这个独立进程会被系统更快地回收,旧的WebView资源和会话能更彻底地被清理,不过要注意跨进程的回调处理(比如WebView的Client回调),避免出现空指针问题
内容来源于stack exchange




