为减轻 android APP 在原生代码下花费的时间,通常用 WebView 来加载本地 H5 的方式,但如果 WebView 默认下是不对手机的三个物理按键键作监听的,这样就很容易导致一个返回键令这个 APP 马上退出,但有时有误操作可能,这样就造成对使用者的麻烦。
所以这里就给出几个加返回键监听的方法。
方案1:给 WebView 设置 setOnKeyListener
webView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
// 监听手机的返回键
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
webView.goBack();
return true;
}
}
return false;
}
});
但这种方案虽然解决了返回键不容易退出,并让它的作用放在了页面的【后退】功能上。可这并不是很人性化,返回键做不到退出 APP 的作用了,正常 APP 的个性化是可以连续按两下返回键退出 APP,而不是一直退不出(这有点流氓的感觉了)。
方案2:重写 Activity 的 onKeyDown 方法
// 退出时间
private long currentBackPressedTime = 0;
// 退出间隔
private static finalint BACK_PRESSED_INTERVAL = 2000;
……
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
closeApp();
return true;
}
return super.onKeyDown(keyCode, event);
}
private void closeApp() {
if ((System.currentTimeMillis() - currentBackPressedTime) > BACK_PRESSED_INTERVAL ) {
Common.Toast(this, "再按一次退出");
currentBackPressedTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
}
这样就解决了连续按两下返回键,才会退出 Activity 的问题,但如果和方案1中的代码搭配使用时,依然会回到方案1的那种现象,如何让它化解冲突?
可以优化一下 closeApp 方法中的代码:
private void closeApp() {
if ((System.currentTimeMillis() - closeAppTime) > BACK_PRESSED_INTERVAL) {
Common.Toast(this, "再按一次退出");
closeAppTime = System.currentTimeMillis();
MyWebView.getWebView().goBack();
} else {
finish();
System.exit(0);
}
}
而在 MyWebView 类中有个返回 getWebView 的方法
public static WebView getWebView() {
return webView;
}
转载请注明:隨習筆記 » WebView 监听手机的物理返回键