app 退到主界面之后,点击一下 home 键弹出提示:”再点一下退出程序“,要实现这个功能,首先就要先搞懂这三个方法之间的调用关系。
所以,见名知意:
首先瞅瞅 onKeyDown() 的源码:(太长了咱看重点)
可以看到,如果是点击了 Home 键( 也就是 KEYCODE_BACK )的话,将会调用 onBackPressed() 方法
我们可以看到,在 onBackPressed() 方法中,又调用了 finishAfterTransition() 方法
很明显该方法的作用就是结束丹铅活动,所以流程就很清晰了,再看看它的调用
你也可以那自己的音量键做做测试,一直按着一直调用 onKeyDown()
类似这里贴下官方文档,就不唠叨了:
很明显,要实现这个功能,首先要重写这几个方法,这时我们先注意下文档,我们看到:无论是 onKeyDown onKeyUp 都有类似这么一句话
重点:如果我们仅仅希望使用我们自己的代码,不希望再去执行系统代码,就返回 true ,如果执行完我们自己的代码后,依然打执行系统代码,就返回 false,我们当然不希望在执行系统代码,是的活动又被 finish() 调,所以我们这里返回 true。
首先判断 是否为 Home 键,如果是,执行自己代码,否则执行系统代码( 不加判断的话,你双击音量键也得退出 )
代码如下:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK){
long secondTime = System.currentTimeMillis();
if (secondTime - firstClicked > 2000) {
LogUtils.d("up");
ToastUtils.makeText(MainActivity.this, "在按一次退出");
firstClicked = secondTime;
return true;
} else {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
}
return true;
}
这时你会发现音量键也失效了,所以我们得加上另一个条件,如果不是 Home 键则一切照常:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK){
long secondTime = System.currentTimeMillis();
if (secondTime - firstClicked > 2000) {
LogUtils.d("up");
ToastUtils.makeText(MainActivity.this, "在按一次退出");
firstClicked = secondTime;
return true;
} else {
Intent intent = new Intent(Intent.ACTION_MAIN);// 退到后台而不结束
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
return true;
}else {
return super.onKeyUp(keyCode, event);// 按其他键则照常调用
}
}
如果觉得不错,别忘了点赞哦!! ?
这就是我自己的理解,如果有错误的话欢迎大家在评论区指出~