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菜单


  • 2017-09-05 11:48:16

    Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)

    容器,字面上理解就是装东西的东西。常见的变量、对象属性等都可以算是容器。一个容器能够装什么,全部取决于你对该容器的定义。当然,有这样一种容器,它存放的不是文本、数值,而是对象、对象的描述(类、接口)或者是提供对象的回调,通过这种容器,我们得以实现许多高级的功能,其中最常提到的,就是 “解耦” 、“依赖注入(DI)”。本文就从这里开始。

  • 2017-09-11 09:22:09

    nginx配置返回文本或json

     有些时候请求某些接口的时候需要返回指定的文本字符串或者json字符串,如果逻辑非常简单或者干脆是固定的字符串,那么可以使用nginx快速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用并且响应性能非常快

  • 2017-09-11 11:30:09

    linux 获取经过N层Nginx转发的访问来源真实IP

    通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了nginx作为反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址。如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下:

  • 2017-09-11 16:15:11

    Nginx日志管理

    通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。

  • 2017-09-11 16:34:14

    Nginx如何保留真实IP和获取前端IP

    squid,varnish以及nginx等,在做反向代理的时候,因为要代替客户端去访问服务器,所以,当请求包经过反向代理后,在代理服务器这里这个IP数据包的IP包头做了修改,最终后端web服务器得到的数据包的头部的源IP地址是代理服务器的IP地址,这样一来,后端服务器的程序给予IP的统计功能就没有任何意义,所以在做代理或集群的时候必须解决这个问题,这里,我以nginx做集群或代理的时候如何给后端web服务器保留(确切的说是传递)客户端的真实IP地址。

  • 2017-09-11 16:35:22

    ngx_http_realip_module使用详解

    网络上关于ngx_http_realip_module的文章千篇一律,全是在说怎么安装,最多贴一个示例配置,却没有说怎么用,为什么这么用,官网文档写得也十分简略,于是就自己探索了一下。

  • 2017-09-11 16:39:43

    基于Nginx dyups模块的站点动态上下线

    在分布式服务下,我们会用nginx做负载均衡, 业务站点访问某服务站点的时候, 统一走nginx, 然后nginx根据一定的轮询策略,将请求路由到后端一台指定的服务器上。