• Android实现 再按一次退出 的三种方法 durationTime、timerTask 和Handler


    目前很多Android应用都会实现按返回键时提示“再按一次推退出”
    
    在这篇文章中总结了各家的方法,一般都是监听Activity的onKeyDown 或者onBackPressed方法
    
    
    方法一:
    
    直接计算时间差来实现。
    
    [java] view plaincopy
    final int mDuraction = 2000; // 两次返回键之间的时间差  
    long mLastTime = 0; // 最后一次按back键的时刻  
      
    @Override  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
        if(keyCode == KeyEvent.KEYCODE_BACK) {// 截获back事件  
              
            exitApp();  
            return true;  
        } else {  
            return super.onKeyDown(keyCode, event);  
        }  
    }  
      
    private void exitApp() {  
          
        if(System.currentTimeMillis() - mLastTime > mDuraction) {  
            Toast.makeText(this, "再按一次退出", 0).show();  
            mLastTime = System.currentTimeMillis();  
        } else {  
            finish();  
        }  
    }  
    
    方法二:
    通过Timer定时器来实现按两次退出。
    
    [java] view plaincopy
    final int mDuraction = 2000; // 两次返回键之间的时间差   
    private boolean isExit = false;   
    private Timer mTicker = null;  
    @Override  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
        if(keyCode == KeyEvent.KEYCODE_BACK) {// 截获back事件  
              
            exitByTimeTicker();  
            return true;  
        } else {  
            return super.onKeyDown(keyCode, event);  
        }  
    }  
      
    private void exitByTimeTicker() {  
          
        if(isExit) { // 退出应用  
              
            finish();  
        } else {  
            // 第一次按back键,弹出提示  
            Toast.makeText(getApplicationContext(), "再按一次退出", 0).show();  
              
            isExit = !isExit;  
            if(null == mTicker) {  
                mTicker = new Timer();  
            }  
              
            mTicker.schedule(new TimerTask() {  
                @Override  
                public void run() {  
                    isExit = false; // 改变标识  
                }  
            }, mDuraction); // 如果第一次按back 2秒后没操作,则使用计时器取消退出操作的标识  
        }  
          
    }  
    
    方法三:
     通过Handler机制,判断EXIT_WAIT消息是否存在消息队列中来判断是否是第二次点击Back键
    
    [java] view plaincopy
    final int mDuraction = 2000; // 两次返回键之间的时间差   
    private final int MSG_EXIT = 0x0808;  
    private final int MSG_EXIT_WAIT = 0x0810;  
      
    @Override  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
        if(keyCode == KeyEvent.KEYCODE_BACK) {// 截获back事件  
              
            mHandler.sendEmptyMessage(MSG_EXIT);  
            return true;  
        } else {  
            return super.onKeyDown(keyCode, event);  
        }  
    }  
      
    private Handler mHandler = new Handler(){  
      
        public void handleMessage(Message msg) {  
            switch (msg.what) {  
                case MSG_EXIT:  
                    if(this.hasMessages(MSG_EXIT_WAIT)) {  
                        // 如果MSG_EXIT_WAIT 还存在MessageQueue中,说明已经按了一次Back键,那么就finish当前activity  
                        finish();  
                    } else {  
                          
                        Toast.makeText(getApplicationContext(), "再按一次退出", 0).show();  
                        this.sendEmptyMessageDelayed(MSG_EXIT_WAIT, mDuraction);  
                    }  
                    break;  
                case MSG_EXIT_WAIT:  
                    break;  
                default:  
                    break;  
            }  
        };  
    };  
  • 相关阅读:
    从汇编看c++对静态成员的存取
    从汇编看c++内联函数评估求值
    从汇编看c++初始化列表初始化成员变量
    53. sql2005“备份集中的数据库备份与现有的xx数据库不同”解决方法
    52. 查看linux系统是32位还是64位
    51. linux卸载jdk
    50. linux下查看tomcat日志
    49. jdk-6u45-linux-i586.bin安装步骤
    48. Linux 删除文件夹命令
    47. linux下给已经存在的用户设置用户组
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4580599.html
Copyright © 2020-2023  润新知