android检测返回键onBackPressed和onKeyDown区别

2020-02-21 22:50:13

参考地址 Android实现监听返回键,主键(HOME),菜单键

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

利用onKeyDown方法,就可以实现

  1. 简介

  2. 监听 返回键

  3. 监听 主键(Home键)

  4. 监听 菜单键

一.简介

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

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

二.监听 返回键

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

复制代码

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

复制代码

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

利用onKeyDown方法,就可以实现

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

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

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

复制代码

   @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
               Intent intent = new Intent(Intent.ACTION_MAIN);  
               intent.addCategory(Intent.CATEGORY_HOME);  
               startActivity(intent);
        }        return super.onKeyDown(keyCode, event);
    }

复制代码

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

复制代码

private long exitTime = 0;

@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {    if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){   
        if((System.currentTimeMillis()-exitTime) > 2000){  
            Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();                                
            exitTime = System.currentTimeMillis();   
        } else {
            finish();
            System.exit(0);
        }        return true;   
    }    return super.onKeyDown(keyCode, event);
}

复制代码

三.监听 主键(Home键)

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

    @Override 
    protected void onUserLeaveHint() { 
        super.onUserLeaveHint(); 
        Toast.makeText(this, "onUserLeaveHint", Toast.LENGTH_SHORT).show();
    }

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

四.监听 菜单键

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

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

复制代码

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

复制代码

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

复制代码

    @Override    public void onOptionsMenuClosed(Menu menu) {        super.onOptionsMenuClosed(menu);
        Toast.makeText(this, "onOptionsMenuClosed clicked", Toast.LENGTH_SHORT)
        .show();
    }

复制代码

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


  • 2019-10-09 13:38:20

    NPM依赖包版本号~和^和*的区别

    ~ 会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0 ^ 会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0 * 这意味着安装最新版本的依赖包

  • 2019-10-09 14:39:40

    import双反斜杠\\的意思

    ​ \表示引用根目录下面的PHPEXcel;不用\的话是引用当前目录下面的 PHPExcel

  • 2019-10-09 15:33:31

    nuxt,nuxtjs简单介绍以及使用

    在集成的服务器端框架之间进行选择: 选择您喜欢的 UI 框架: 选择您喜欢的测试框架: 选择你想要的 Nuxt 模式 (Universal or SPA) 添加 axios module 以轻松地将 HTTP 请求发送到您的应用程序中。 添加 EsLint 以在保存时代码规范和错误检查您的代码。 添加 Prettier 以在保存时格式化/美化您的代码。

  • 2019-10-10 00:21:35

    laravel 5.6以上日志理解及日志格式定义

    Laravel/Lumen的日志默认是基于Monolog进行了一层封装,如果要求不高,用起来还是十分容易的,本文基于laravel5.6/Lumen5.6版本进行解说。5.6版对日志系统做了升级,将日志的配置单独放以了config/logging.php 配置文件中,所以现在实用多了。

  • 2019-10-10 10:10:49

    @Scheduled注解各参数详解

    每隔5秒执行一次:*/5 * * * * ? 每隔1分钟执行一次:0 */1 * * * ? 每天23点执行一次:0 0 23 * * ? 每天凌晨1点执行一次:0 0 1 * * ? 每月1号凌晨1点执行一次:0 0 1 1 * ? 每月最后一天23点执行一次:0 0 23 L * ? 每周星期天凌晨1点实行一次:0 0 1 ? * L 在26分、29分、33分执行一次:0 26,29,33 * * * ? 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

  • 2019-10-10 11:07:47

    Java8 - Map更优雅的迭代方式:forEach

    用于两个参数之间进行操作的函数式接口是 BiConsumer。这个函数式接口正好用来操作 Map 的 key 和 value。JDK8强化了针对 Map 类的迭代方式,新增了一个默认方法 forEach,它接收一个 BiConsumer 函数。JDK给出的描述如下: