1. 目前很多Android应用都会实现按返回键时提示“再按一次推退出”
  2.  
  3. 在这篇文章中总结了各家的方法,一般都是监听ActivityonKeyDown 或者onBackPressed方法
  4.  
  5. 方法一:
  6.  
  7. 直接计算时间差来实现。
  8.  
  9. [java] view plaincopy
  10. final int mDuraction = 2000; // 两次返回键之间的时间差
  11. long mLastTime = 0; // 最后一次按back键的时刻
  12.  
  13. @Override
  14. public boolean onKeyDown(int keyCode, KeyEvent event) {
  15. if(keyCode == KeyEvent.KEYCODE_BACK) {// 截获back事件
  16.  
  17. exitApp();
  18. return true;
  19. } else {
  20. return super.onKeyDown(keyCode, event);
  21. }
  22. }
  23.  
  24. private void exitApp() {
  25.  
  26. if(System.currentTimeMillis() - mLastTime > mDuraction) {
  27. Toast.makeText(this, "再按一次退出", 0).show();
  28. mLastTime = System.currentTimeMillis();
  29. } else {
  30. finish();
  31. }
  32. }
  33.  
  34. 方法二:
  35. 通过Timer定时器来实现按两次退出。
  36.  
  37. [java] view plaincopy
  38. final int mDuraction = 2000; // 两次返回键之间的时间差
  39. private boolean isExit = false;
  40. private Timer mTicker = null;
  41. @Override
  42. public boolean onKeyDown(int keyCode, KeyEvent event) {
  43. if(keyCode == KeyEvent.KEYCODE_BACK) {// 截获back事件
  44.  
  45. exitByTimeTicker();
  46. return true;
  47. } else {
  48. return super.onKeyDown(keyCode, event);
  49. }
  50. }
  51.  
  52. private void exitByTimeTicker() {
  53.  
  54. if(isExit) { // 退出应用
  55.  
  56. finish();
  57. } else {
  58. // 第一次按back键,弹出提示
  59. Toast.makeText(getApplicationContext(), "再按一次退出", 0).show();
  60.  
  61. isExit = !isExit;
  62. if(null == mTicker) {
  63. mTicker = new Timer();
  64. }
  65.  
  66. mTicker.schedule(new TimerTask() {
  67. @Override
  68. public void run() {
  69. isExit = false; // 改变标识
  70. }
  71. }, mDuraction); // 如果第一次按back 2秒后没操作,则使用计时器取消退出操作的标识
  72. }
  73.  
  74. }
  75.  
  76. 方法三:
  77. 通过Handler机制,判断EXIT_WAIT消息是否存在消息队列中来判断是否是第二次点击Back
  78.  
  79. [java] view plaincopy
  80. final int mDuraction = 2000; // 两次返回键之间的时间差
  81. private final int MSG_EXIT = 0x0808;
  82. private final int MSG_EXIT_WAIT = 0x0810;
  83.  
  84. @Override
  85. public boolean onKeyDown(int keyCode, KeyEvent event) {
  86. if(keyCode == KeyEvent.KEYCODE_BACK) {// 截获back事件
  87.  
  88. mHandler.sendEmptyMessage(MSG_EXIT);
  89. return true;
  90. } else {
  91. return super.onKeyDown(keyCode, event);
  92. }
  93. }
  94.  
  95. private Handler mHandler = new Handler(){
  96.  
  97. public void handleMessage(Message msg) {
  98. switch (msg.what) {
  99. case MSG_EXIT:
  100. if(this.hasMessages(MSG_EXIT_WAIT)) {
  101. // 如果MSG_EXIT_WAIT 还存在MessageQueue中,说明已经按了一次Back键,那么就finish当前activity
  102. finish();
  103. } else {
  104.  
  105. Toast.makeText(getApplicationContext(), "再按一次退出", 0).show();
  106. this.sendEmptyMessageDelayed(MSG_EXIT_WAIT, mDuraction);
  107. }
  108. break;
  109. case MSG_EXIT_WAIT:
  110. break;
  111. default:
  112. break;
  113. }
  114. };
  115. };

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. 增强Delphi.RemObject.DataAbstract的脚本功能:多数据库同时操作

    我们知道,通过Schema,一个DataAbstracService对应一个数据库:一个服务器可以包含多个DataAbstracService,从而实现对多个数据库的操作.通过事件处理我们可以在一个D ...

  2. android 安全未来怎么走

  3. xampp中mysql设置密码

    发现网上的解决办法都比较过时.嗯,解决办法很简单. 打开浏览器localhost:[port]/phpmyadmin/ 点击用户账户选项 选择用户名为root,Host name为localhost也 ...

  4. lightOJ 1317 Throwing Balls into the Baskets

    lightOJ  1317  Throwing Balls into the Baskets(期望)  解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/ ...

  5. codeforces 569A Music

    codeforces  569A   Music   解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88890#pro ...

  6. jacksonall的使用,解析json

    转自:http://www.cnblogs.com/lee0oo0/archive/2012/08/23/2652751.html , Jackson可以轻松的将Java对象转换成json对象和xml ...

  7. HTML5 总结-服务器发送事件-9

    HTML 5 服务器发送事件 HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新. Server-Sent 事件 - 单向消息传递 Server-Sent 事 ...

  8. asp.net 开发注意的几点

    WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法: 这主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 可以通过在运行里面 ...

  9. Qt Creator插件工作流程代码走读

    Qt Creator有个很风骚的插件管理器PluginManager,还有个很骚包的插件说明PluginSpec.基本上,所有的Qt程序的入口都是传统的C程序一样,代码流程从main()函数开始.  ...

  10. 【学习】leader特别忙工作到晚上11点左右,组员7点左右下班了,作为leader怎么办?

    Ø  leader先将自己做的事情罗列出来,选出不属于leader当前职责的工作内容. Ø  将不属于leader职责内容的部分授权给组员(承担更多的责任,职责). Ø  授权时,先考察组员的能力和了 ...