Android onKeyDown事件详解

一、前言:

本篇文章介绍如何在Android中实现监听返回键,主键,菜单键。一般情况下,我们都可以在Android手机底部看到三个按钮,这三个按钮就分别是返回键,主键,菜单键。

接下来介绍监听这三个键的实现。

二、监听返回键

1、第一种方法通过onBackPressed()方法来实现

复制代码
/**
* 注意:
* super.onBackPressed()会自动调用finish()方法,关闭当前Activity.
*/
@Override
public void onBackPressed() {
super.onBackPressed();
Toast.makeText(this, "按下了back键 onBackPressed()", Toast.LENGTH_SHORT).show();
}
复制代码

说明:onBackPressed()提供的功能有限,它这是在退出之前通知onBackPressed()方法,并不能改变用户原来的行为

2、利用onKeyDown方法,就可以实现

复制代码
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
      if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Toast.makeText(this, "按下了back键 onKeyDown()", Toast.LENGTH_SHORT).show();
            return false;
       }else {
            return super.onKeyDown(keyCode, event);
      }
}
复制代码

 

说明:onKeyDown方法返回true表示退出,返回false便不退出。

3、还可以通过跳转来实现退出

复制代码
1 @Override
2 public boolean onKeyDown(int keyCode, KeyEvent event) {
3       if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
4             Intent intent = new Intent(Intent.ACTION_MAIN);
5             intent.addCategory(Intent.CATEGORY_HOME);
6             startActivity(intent);
7      }
8     return super.onKeyDown(keyCode, event);
9 }
复制代码

 

4、通过onKeyDown我们可以实现,实现“再按一次返回键退出程序”的功能

复制代码
 1 private long exitTime = 0;
 2 @Override
 3 public boolean onKeyDown(int keyCode, KeyEvent event) {
 4        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
 5              if((System.currentTimeMillis()-exitTime) > 2000){
 6                     Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
 7                    exitTime = System.currentTimeMillis();
 8              } else {
 9                     finish();
10                     System.exit(0);
11               }
12         return true;
13 }
14  return super.onKeyDown(keyCode, event);
15 }
复制代码

 

三、监听 主键(Home键)

监听Home键可以通过onUserLeaveHint()方法来实现,

1 @Override
2 protected void onUserLeaveHint() {
3       super.onUserLeaveHint();
4       Toast.makeText(this, "onUserLeaveHint", Toast.LENGTH_SHORT).show();
5 }

 

说明:在这个方法中,我们可以观察出,如果onUserLeaveHint方法是不能改变用户的行为的。

四、监听 菜单键

在手机下方的三个键中,最右边的键就是菜单键,通常是用方括号表示的。经过笔者的测试发现,如果轻点一下,那么会跳出菜单界面,如果长点的话,那么会退出程序。这个过程会自动调用onUserLeaveHint方法,也就是主键。

1、菜单的监听也可以通过onKeyDown()方法来实现

复制代码
1 @Override
2 public boolean onKeyDown(int keyCode, KeyEvent event) {
3      if (keyCode == KeyEvent.KEYCODE_MENU) {
4         Toast.makeText(this, "onkeyDown clicked", Toast.LENGTH_SHORT)
5                 .show();
6         super.openOptionsMenu(); // 调用这个,就可以弹出菜单
7       }
8       return true; // 最后,一定要做完以后返回 true,或者在弹出菜单后返回true,其他键返回super,让其他键默认
9 }
复制代码

 

2、处理上面这样的方法,onOptionsMenuClosed()方法也可以实现。

1 @Override
2 public void onOptionsMenuClosed(Menu menu) {
3        super.onOptionsMenuClosed(menu);
4         Toast.makeText(this, "onOptionsMenuClosed clicked", Toast.LENGTH_SHORT)
5 .show();
6 }

 

经过笔者的测试,发生这些方法在高版本中可能出现不兼容的情况,关于菜单可以查看 Android中Menu菜单

五、onKeyDown详解:

监听返回键,通过在 Activity 中重写onKeyDown方法。

1  override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
2         return super.onKeyDown(keyCode, event)
3     }

 

  • onKeyDown方法,该方法是接口KeyEvent.Callback中的抽象方法,所有的View全部实现了该接口并重写了该方法,该方法用来捕捉手机键盘被按下的事件。

  • 参数keyCode,该参数指的是被按下的键的键盘码,手机键盘中每个按钮都会有其对应的键盘码,在应用程序都是通过键盘码才知道用户按下的是哪个键。

  • 当用户按下按键时,系统会自动将事件封装成KeyEvent对象供应用程序使用。按键事件KeyEvent按键事件有多种常量类型,比如 KEYCODE_BACK

  • 返回值,该方法的返回值为一个boolean类型的变量,当返回true时,表示已经完整地处理了这个事件,并不希望其他的回调方法再次进行处理,而当返回false时,表示并没有完全处理完该事件,更希望其他回调方法继续对其进行处理,例如Activity中的回调方法。


链接:https://www.jianshu.com/p/9da340c237d3

posted @   小城青年  阅读(1029)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示