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-09-08 15:09:14

    IDEA从mapper.java跳转到mapper.xml

    在IDEA中写项目后台的时候,从controller到service到mapper到dao,都可以直接跳转,但是mapper.java到mapper.xml就需要自行寻找,为了开发方便,安装相应插件--mybais

  • 2019-09-08 21:44:15

    git pre-commit hook failed 解决办法

    今天在上传项目的时候在commit阶段遇到一个问题,无论是在Sourcetree上传还是用命令git commit -m 'xxx'都报了一下错误:

  • 2019-09-08 21:45:31

    git index.lock

    因是在你进行某些比较费时的git操作时自动生成,操作结束后自动删除,相当于一个锁定文件,目的在于防止对一个目录同时进行多个操作。 有时强制关闭进行中的git操作,这个文件没有被自动删除,之后你就无法进行其他操作,必须手动删除,进入.git文件中删除,打开显示隐藏文件。如果没有看见.git文件夹,可以直接用命令rm -f ./.git/index.lock。之后就可以正常使用。 ———————————————— 版权声明:本文为CSDN博主「李瑞豪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_39520417/article/details/81941111

  • 2019-09-09 05:28:54

    IntelliJ IDEA 进阶教程: 语言注入

    我真的太久没发 IntelliJ 的教程了,最近 Sakura 同学找我帮他配 IntelliJ ,我秀了一下技术,假装自己是老司机。 然后发现 Language Injection 这个非常好用的功能我居然没写教程(很明显,一堆人不知道这个东西), 于是我又开始写教程了。 本文多图。

  • 2019-09-09 05:32:55

    SrpingBoot 热启动与热部署

    当我们已经启动了一个服务,然后修改代码之后,会自动重新部署。Spring项目通常有新内容修改后需要重新编译然后运行。通过配置Spring boot的热启动配置,可以实现自动编译重启项目,通常要比手动停止,启动项目快。