You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android WebView销毁后快速重启Activity时游戏提示会话已在其他窗口打开的问题

Android WebView销毁后快速重启Activity时游戏提示会话已在其他窗口打开的问题

这个问题我之前也碰到过类似的场景,核心原因其实是WebView的销毁并不是「立即完成所有清理」的——哪怕你在onDestroy()里调用了webView.destroy(),底层的网络连接、和游戏服务器绑定的会话标识可能还没来得及彻底断开,服务器那边会误以为旧的会话窗口还在活跃,所以快速重启Activity时就会弹出会话冲突的提示。

给你几个亲测有效的解决思路,你可以挨个试试:

  • 提前在生命周期早期做WebView的暂停与清理:不要等到onDestroy()才动手,在onPause()里就先切断WebView的运行状态:

    1. 先调用webView.stopLoading()停止当前加载
    2. 再调用webView.onPause(),这个方法会暂停WebView的所有布局、解析和JavaScript执行,包括Flash插件的运行,能提前终止游戏的会话连接
    3. 还可以加上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

火山引擎 最新活动