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

WebView点击返回键直接退出APP而非返回上一页的问题排查

解决WebView点击返回键直接关闭应用的问题

嘿,我明白你现在的困扰——点击返回键本该回到WebView的上一页,结果直接把应用关了对吧?咱们来拆解下问题,然后一步步解决它。

问题根源

你的代码里,WebViewClientshouldOverrideUrlLoading方法返回了true,这会让Android系统认为你已经完全接管了URL加载的逻辑,WebView就不会自动维护页面的历史栈了。没有历史栈,mywebView.canGoBack()自然一直返回false,点击返回键就直接触发finish()关闭应用了。

修复方案

1. 修正shouldOverrideUrlLoading方法

把这个方法的返回值改成false,让WebView自己处理URL加载,这样它才会正确记录页面历史。同时为了兼容Android 7.0(API 24)及以上版本,最好加上重载的新方法:

mywebView.setWebViewClient(new WebViewClient(){
    // 兼容旧版本Android
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        view.loadUrl(url);
        return false; // 关键:返回false让WebView维护历史栈
    }

    // 兼容Android N及以上版本
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        view.loadUrl(request.getUrl().toString());
        return false;
    }
});

2. 优化返回键逻辑(你的基础逻辑没问题,这里做小调整)

可以加上对重复按键的判断,避免长按返回键多次触发不必要的操作:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // 只处理单次按下动作,过滤长按重复触发
    if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
        if(mywebView != null && mywebView.canGoBack()){
            mywebView.goBack();
            return true;
        } else {
            finish();
        }
    }
    return super.onKeyDown(keyCode, event);
}

完整修改后的MainActivity代码

public class MainActivity extends AppCompatActivity {
    WebView mywebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mywebView = findViewById(R.id.webview);
        
        WebSettings webSettings = mywebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        
        mywebView.loadUrl("http://www.google.co.in");
        
        mywebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url){
                view.loadUrl(url);
                return false;
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(request.getUrl().toString());
                return false;
            }
        });
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
            if(mywebView != null && mywebView.canGoBack()){
                mywebView.goBack();
                return true;
            } else {
                finish();
            }
        }
        return super.onKeyDown(keyCode, event);
    }
}

测试建议

修改完代码后,先在WebView里跳转2-3个页面,再点击返回键,应该就能正常回到上一页了;当没有上一页时,才会关闭应用。

内容的提问来源于stack exchange,提问作者Shubham Kumar

火山引擎 最新活动