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

来源:互联网 发布:数据库巡检报告 编辑:程序博客网 时间:2024/05/20 09:47

目前很多Android应用都会实现按返回键时提示“再按一次推退出”

在这篇文章中总结了各家的方法,一般都是监听Activity的onKeyDown 或者onBackPressed方法


方法一:

直接计算时间差来实现。

    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定时器来实现按两次退出。

    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键

    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;            }        };    };



1 0
原创粉丝点击