本片博客将详细介绍:
- Android 活动中 onKeyDown() onKeyUp() onBackPressed() 三个方法的关系及使用
- 最后给出实现双击退回桌面的源码实例
大家经常能接到一个需求
app 退到主界面之后,点击一下 home 键弹出提示:”再点一下退出程序“,要实现这个功能,首先就要先搞懂这三个方法之间的调用关系。
所以,见名知意:
- onKeyDown 就是按下按键的意思,
- onKeyUp 就是松开按键的意思,
- onBackPressed 就是返回键被点击的意思。
我们先看下源码
首先瞅瞅 onKeyDown() 的源码:(太长了咱看重点)
可以看到,如果是点击了 Home 键( 也就是 KEYCODE_BACK )的话,将会调用 onBackPressed() 方法
我们接着看 onBackPressed() 方法
我们可以看到,在 onBackPressed() 方法中,又调用了 finishAfterTransition() 方法
很明显该方法的作用就是结束丹铅活动,所以流程就很清晰了,再看看它的调用
你也可以那自己的音量键做做测试,一直按着一直调用 onKeyDown()
总结一下
- 当我们按下 Home 键(其他键,像音量键啥的也一样)的时候调用 onKeyDown() ,
- 然后该方法会判断是那个键被按下,
- 如果是 Home 键的话,就调用 onBackPressed() 方法,
- 接着 onBackPressed() 方法又调用了 finishAfterTransition() 方法结束当前活动
onKeyUp() 方法
类似这里贴下官方文档,就不唠叨了:
双击退回桌面但活动仅退到后台的实现
很明显,要实现这个功能,首先要重写这几个方法,这时我们先注意下文档,我们看到:无论是 onKeyDown onKeyUp 都有类似这么一句话
重点:如果我们仅仅希望使用我们自己的代码,不希望再去执行系统代码,就返回 true ,如果执行完我们自己的代码后,依然打执行系统代码,就返回 false,我们当然不希望在执行系统代码,是的活动又被 finish() 调,所以我们这里返回 true。
重写 onKeyUp() 方法
首先判断 是否为 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);// 按其他键则照常调用
}
}
如果觉得不错,别忘了点赞哦!! ?
这就是我自己的理解,如果有错误的话欢迎大家在评论区指出~