You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android WebView加载网页游戏:如何关闭网页并解决退出后后台运行问题

嘿,这个问题我太熟了——很多用WebView套网页游戏的开发者都踩过这个坑!本质就是WebView背后的Chromium进程没被彻底销毁,导致游戏的JS还在后台偷偷跑。咱们一步步来解决:

核心解决方案:彻底清理WebView资源

1. 处理退出确认时的即时清理

当用户点击“确认退出”按钮时,别直接调用finish()关闭Activity,先给WebView做一波“断舍离”,切断它的运行环境:

// 在你的退出确认对话框的"是"按钮点击事件里
if (mWebView != null) {
    // 加载空白页,立即终止当前网页的JS执行
    mWebView.loadUrl("about:blank");
    // 移除WebView的所有子视图,释放视图资源
    mWebView.removeAllViews();
    // 彻底销毁WebView实例
    mWebView.destroy();
    // 置空引用,帮助GC回收
    mWebView = null;
}
// 最后再关闭Activity
finish();

2. 在Activity销毁时做兜底处理

用户可能会通过系统返回键以外的方式退出应用(比如从最近任务栏划掉),所以一定要在onDestroy()方法里再加一层兜底清理,确保万无一失:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mWebView != null) {
        // 先停止当前所有加载请求
        mWebView.stopLoading();
        // 清除WebView的缓存和历史记录
        mWebView.clearCache(true);
        mWebView.clearHistory();
        // 如果之前给WebView注入过JS接口,记得移除它
        mWebView.removeJavascriptInterface("YourCustomInterface");
        // 再次加载空白页,确保JS环境彻底终止
        mWebView.loadUrl("about:blank");
        // 把WebView从父布局中移除,避免内存泄漏
        ViewParent parent = mWebView.getParent();
        if (parent != null) {
            ((ViewGroup) parent).removeView(mWebView);
        }
        // 销毁WebView并置空引用
        mWebView.destroy();
        mWebView = null;
    }
}

3. 进阶优化:通知JS游戏主动清理(可选)

如果你能修改网页游戏的JS代码,那可以通过Android和JS的交互,让游戏在退出前主动暂停并清理资源,这会更优雅:

// 初始化WebView时注入一个交互接口
mWebView.addJavascriptInterface(new Object() {
    @JavascriptInterface
    public void notifyAppExit() {
        // 调用游戏的JS清理方法
        mWebView.loadUrl("javascript:gameCleanupAndStop()");
    }
}, "AndroidBridge");

// 在退出时先通知JS清理,再销毁WebView
if (mWebView != null) {
    mWebView.loadUrl("javascript:AndroidBridge.notifyAppExit()");
    // 给JS留几百毫秒的清理时间,再执行销毁操作
    new Handler(Looper.getMainLooper()).postDelayed(() -> {
        mWebView.loadUrl("about:blank");
        mWebView.destroy();
        mWebView = null;
        finish();
    }, 500);
}

提示:如果没法修改网页的JS代码,那直接用前两个步骤就足够解决问题了。

为什么会出现这个问题?

默认情况下,Android的WebView是基于独立的Chromium进程运行的,如果你只是关闭Activity而不主动销毁WebView,这个Chromium进程可能会被系统保留,里面的JS游戏自然会继续在后台运行。咱们上面的操作就是彻底切断WebView的所有资源引用,让系统可以回收这个进程,从而彻底终止游戏运行。

内容的提问来源于stack exchange,提问作者Ábel Bársony

火山引擎 最新活动