zoukankan      html  css  js  c++  java
  • 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;  
            }  
        };  
    };  
  • 相关阅读:
    Semaphore使用
    不可变对象
    Java锁--Lock实现原理(底层实现)
    Lambda Expressions and Functional Interfaces: Tips and Best Practices
    注解的作用
    linux命令大全
    linux &和&&,|和||
    SpringCloud 商品架构例子(一)
    springcloud starter(一)
    dubbo(一)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4580599.html
Copyright © 2011-2022 走看看