目前很多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;
}
};
};

Android实现 再按一次退出 的三种方法 durationTime、timerTask 和Handler的更多相关文章

  1. 【Android】Eclipse自动编译NDK/JNI的三种方法

    [Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...

  2. Android程序完全退出的三种方法

    很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现. 首 ...

  3. Android监听点击事件实现的三种方法

    监听点击事件实现的三种方法:1.匿名内部类2.外部类3.直接实现接口 1.匿名内部类: package com.jereh.calculator; import android.content.Con ...

  4. Android项目实战(二):安卓应用程序退出的三种方法

    现在的APP退出的时候都不是让用户点击了“后退键”就退出.防止用户点错了后退键而造成的用户体检不好. 一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把 目前流行的解决一般分为两种: ...

  5. Android程序全然退出的三种方法

    1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid())    //获取PID,眼下获取自己的也仅仅有该 ...

  6. Android解析xml文件-采用DOM,PULL,SAX三种方法解析

    解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...

  7. Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!

    大网站都有推出自己的手机访问版本页面,不管是新闻类还是视频网站,我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般 ...

  8. 用Fiddler可以设置浏览器的UA 和 手动 --Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!

    附加以一种软件的方法是:用Fiddler可以设置浏览器的UA 以下3种方法是手动的 通过伪装User-Agent,将浏览器模拟成Android设备. 第一种方法:新建Chrome快捷方式 右击桌面上的 ...

  9. Android开发之去掉标题栏的三种方法,推荐第三种

    Android:去掉标题栏的三种方法和全屏的三种方法 第一种:一般入门的时候常常使用的一种方法 onCreate函数中增加下面代码: requestWindowFeature(Window.FEATU ...

随机推荐

  1. flexjson 的使用

    日期转换             JSONSerializer serializer = new JSONSerializer();         serializer.exclude(new St ...

  2. JAVA中List、Map、Set的区别与选用

    类层次关系如下: Collection ├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap └WeakHashM ...

  3. CSS+DIV标签命名规范 搜索引擎最喜欢

    搜索引擎优化(seo)有很多工作要做,其中对代码的优化是一个很关键的步骤.为了更加符合SEO的规范,下面是目前流行的CSS+DIV的命名规则: 登录条:loginBar  标志:logo  侧栏:si ...

  4. [cocos2d-x]用CCSpriteBatchNode进行文理贴图的优化

    引言: 我们在进行手机游戏开发的过程中,由于手机的内存资源是有限的,那么对纹理贴图的优化是非常有必要的,有可能相同的功能,优化的好与不好对内存资源的消耗是非常明显的,下面我就用一个例子来说明一下. 说 ...

  5. java结构与算法之选择排序

    一 .java结构与算法之选择排序(冒择路兮快归堆) 什么事选择排序:从一组无序数据中选择出中小的的值,将该值与无序区的最左边的的值进行交换. 简单的解释:假设有这样一组数据 12,4,23,5,找到 ...

  6. VMware: linux起步提示 memory for crashkernel(0*0 to 0*0)not within permissible

    (virtualbox/VMware)linux起步提示memoryforcrashkernel(0*0 to 0*0)notwithinpermissible  http://www.myexcep ...

  7. Css小技巧-图片垂直居中

    说明:样式设置主要是针对图片的父级元素,并非图片元素本身. Css代码[图片父级点的样式]: <style> .box { /*非IE的主流浏览器识别的垂直居中的方法*/ display: ...

  8. poj 3252

    http://poj.org/problem?id=3252//自己搞了很长时间...现在刚刚有点明白.. 1 #include <iostream> using namespace st ...

  9. 多种EDA软件的鼠标增强工具EDAHelper

    最新版本(unicode版本,各种语言环境显示中文)下载地址:http://www.jyxtec.com/edahelper/EDAHelper-2.1.13.7z 繁体版:http://www.jy ...

  10. c++ 实现将数字转换为中文数字输出

    实现如下函数: void printInChinese(int num); 这个函数输入一个小于100000000(一亿)的正整数,并在屏幕上打印这个数字的中文写法. 例如: 17 -> 一十七 ...