WebView点击返回键直接退出APP而非返回上一页的问题排查
解决WebView点击返回键直接关闭应用的问题
嘿,我明白你现在的困扰——点击返回键本该回到WebView的上一页,结果直接把应用关了对吧?咱们来拆解下问题,然后一步步解决它。
问题根源
你的代码里,WebViewClient的shouldOverrideUrlLoading方法返回了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




