现在的APP退出的时候都不是让用户点击了“后退键”就退出。防止用户点错了后退键而造成的用户体检不好。

一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把

目前流行的解决一般分为两种:

一、按一次后退键显示一个对话框决定是否退出

 1     @Override
 2     public boolean onKeyDown(int keyCode, KeyEvent event) {
 3         // TODO Auto-generated method stub
 4         //点击了后退键
 5         if(keyCode == KeyEvent.KEYCODE_BACK)
 6         {
 7         //创建对话框构建器对象
 8             AlertDialog.Builder builder = new AlertDialog.Builder(this);
 9             builder.setTitle("温馨提示")//对话框标题
10             .setMessage("确定要退出么?")//对话框内容
11             .setIcon(R.drawable.ic_launcher)//对话框图标
12             .setCancelable(false) //点击对话框之外的部分是否取消对话框
13             .setPositiveButton("确定", new OnClickListener() {
14
15                 @Override
16                 public void onClick(DialogInterface dialog, int which) {
17                     // TODO Auto-generated method stub
18                     finish();//结束当前Activity
19                 }
20             })
21             .setNegativeButton("取消", new OnClickListener() {
22
23                 @Override
24                 public void onClick(DialogInterface dialog, int which) {
25                     // TODO Auto-generated method stub
26                     dialog.dismiss();//取消对话框
27                 }
28             });
29             //生成对话框
30             Dialog dialog = builder.create();
31                         //显示对话框
32             dialog.show();
33         }
34
35         return super.onKeyDown(keyCode, event);
36     }     

二、连续按两次后退键退出,一般两次按键时间间隔为2秒

(1)一般思路方法:

思路。一个应用程序第一次按后退键为 “第一次”  之后的每次按后退键:对于上一次为“第二次”,对于下一次为"第一次" ,判断两次按键时间的差的绝对值是否小于2000(毫秒)

 1 public class MainActivity extends Activity {
 2     long timefirst = 0; //一定要是long类型的
 3     long timesecond = 0;
 4     boolean isKeyBack = false;//当为false ,为应用程序第一次按后退键,第一次按键之后 永为true ,
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9     }
10
11     @Override
12     public boolean onKeyDown(int keyCode, KeyEvent event) {
13         // TODO Auto-generated method stub
14
15         if(keyCode == KeyEvent.KEYCODE_BACK)//如果点击了撤退键
16         {
17             if(isKeyBack==true) //如果isKeyBack==true 说明第二次点击后退键
18             {
19                 timesecond = System.currentTimeMillis();//记录第二次按键的时间
20                 System.out.println("2"+timesecond);
21
22                 if(Math.abs(timesecond-timefirst)<2000)//说明两次按键间隔小于2秒,满足退出条件,退出Activity
23                 {
24                     finish();
25                 }
26                 else
27                 {
28                     timefirst  = System.currentTimeMillis();//记录第一次按键的时间
29                     Toast.makeText(this, "再按一次退出程序", 1).show();
30                     //不满足条件,则设置此次为第一次按键,因为isKeyBack为true
31                                          //屏蔽后退键的撤销功能
32                     return true;
33                 }
34             }
35             else if(isKeyBack==false) //如果isKeyBack为false 说明第一次点击后退键
36             {
37                 timefirst  = System.currentTimeMillis();//记录第一次按键的时间
38                 Toast.makeText(this, "再按一次退出程序", 1).show();
39                 System.out.println("1"+timefirst);
40                 isKeyBack = true;
41                                 //屏蔽后退键的撤销功能
42                 return true;
43
44             }
45         }
46
47         return super.onKeyDown(keyCode, event);
48     }    

(2)优化方法

 1 public class MainActivity extends Activity {
 2     long timefirst = 0; //一定要是long类型的
 3     long timesecond = 0;
 4     boolean isKeyBack = false;
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9     }
10
11     @Override
12     public boolean onKeyDown(int keyCode, KeyEvent event) {
13         // TODO Auto-generated method stub
14         if(keyCode==KeyEvent.KEYCODE_BACK)
15         {
16             timesecond = System.currentTimeMillis();  //记录当前按键时间,相当于上一次为第二次按键
17             if(timesecond-timefirst<2000) //如果两次按键时间小于2000毫秒,结束应用程序
18             {
19                 finish();
20             }
21             else
22             {
23                 Toast.makeText(this, "再按一次退出程序", 1).show();
24                 timefirst = timesecond; //如果不能退出,则当前按键时间设为第一次,下一次为第二次
25                 return true;            //屏蔽后退键的效果 return false;也可以 ,只要不让方法执行super.onKeyDown(keyCode, event);即可
 26  } 27  } 28 return super.onKeyDown(keyCode, event); 29 }

全部代码:

  1 package com.example.menu;
  2
  3 import android.os.Bundle;
  4 import android.app.Activity;
  5 import android.app.AlertDialog;
  6 import android.app.Dialog;
  7 import android.content.DialogInterface;
  8 import android.content.DialogInterface.OnClickListener;
  9 import android.view.KeyEvent;
 10 import android.view.Menu;
 11 import android.widget.Toast;
 12
 13 public class MainActivity extends Activity {
 14     long timefirst = 0; //一定要是long类型的
 15     long timesecond = 0;
 16     boolean isKeyBack = false;
 17     @Override
 18     protected void onCreate(Bundle savedInstanceState) {
 19         super.onCreate(savedInstanceState);
 20         setContentView(R.layout.activity_main);
 21     }
 22
 23     @Override
 24     public boolean onKeyDown(int keyCode, KeyEvent event) {
 25         // TODO Auto-generated method stub
 26         if(keyCode==KeyEvent.KEYCODE_BACK)
 27         {
 28             timesecond = System.currentTimeMillis();  //记录当前按键时间,相当于上一次为第二次按键
 29             if(timesecond-timefirst<2000) //如果两次按键时间小于2000毫秒,结束应用程序
 30             {
 31                 finish();
 32             }
 33             else
 34             {
 35                 Toast.makeText(this, "再按一次退出程序", 1).show();
 36                 timefirst = timesecond; //如果不能退出,则当前按键时间设为第一次,下一次为第二次
 37                 return true;            //屏蔽后退键的效果
 38             }
 39         }
 40         return super.onKeyDown(keyCode, event);
 41     }
 42
 43 //    @Override
 44 //    public boolean onKeyDown(int keyCode, KeyEvent event) {
 45 //        // TODO Auto-generated method stub
 46 //
 47 //        if(keyCode == KeyEvent.KEYCODE_BACK)//如果点击了撤退键
 48 //        {
 49 //            if(isKeyBack==true) //如果isKeyBack==true 说明第二次点击后退键
 50 //            {
 51 //                timesecond = System.currentTimeMillis();//记录第二次按键的时间
 52 //                System.out.println("2"+timesecond);
 53 //
 54 //                if(Math.abs(timesecond-timefirst)<2000)//说明两次按键间隔小于2秒,满足退出条件,退出Activity
 55 //                {
 56 //                    finish();
 57 //                }
 58 //                else
 59 //                {
 60 //                    timefirst  = System.currentTimeMillis();//记录第一次按键的时间
 61 //                    Toast.makeText(this, "再按一次退出程序", 1).show();
 62 //                    //不满足条件,
 63 //                    return true;
 64 //                }
 65 //            }
 66 //            else if(isKeyBack==false) //如果isKeyBack为false 说明第一次点击后退键
 67 //            {
 68 //                timefirst  = System.currentTimeMillis();//记录第一次按键的时间
 69 //                Toast.makeText(this, "再按一次退出程序", 1).show();
 70 //                System.out.println("1"+timefirst);
 71 //                isKeyBack = true;
 72 //                return true;
 73 //
 74 //            }
 75 //        }
 76 //
 77 //        return super.onKeyDown(keyCode, event);
 78 //    }
 79
 80 //    @Override
 81 //    public boolean onKeyDown(int keyCode, KeyEvent event) {
 82 //        // TODO Auto-generated method stub
 83 //        //点击了后退键
 84 //        if(keyCode == KeyEvent.KEYCODE_BACK)
 85 //        {
 86 //            AlertDialog.Builder builder = new AlertDialog.Builder(this);
 87 //            builder.setTitle("温馨提示")//对话框标题
 88 //            .setMessage("确定要退出么?")//对话框内容
 89 //            .setIcon(R.drawable.ic_launcher)//对话框图标
 90 //            .setCancelable(false) //点击对话框之外的部分是否取消对话框
 91 //            .setPositiveButton("确定", new OnClickListener() {
 92 //
 93 //                @Override
 94 //                public void onClick(DialogInterface dialog, int which) {
 95 //                    // TODO Auto-generated method stub
 96 //                    finish();//结束当前Activity
 97 //                }
 98 //            })
 99 //            .setNegativeButton("取消", new OnClickListener() {
100 //
101 //                @Override
102 //                public void onClick(DialogInterface dialog, int which) {
103 //                    // TODO Auto-generated method stub
104 //                    dialog.dismiss();//取消对话框
105 //                }
106 //            });
107 //
108 //            Dialog dialog = builder.create();
109 //            dialog.show();
110 //        }
111 //
112 //        return super.onKeyDown(keyCode, event);
113 //    }
114
115 }

应用程序退出提示

三、连续按两次后退键退出,一般两次按键时间间隔为2秒(handler方法)

设置一个标记变量isExit = false;

当点击后退按钮的 时候

(1)如果isExit为true 退出程序

(2)如果isExit为false 则提示“两秒内再次后退退出程序”,并是isExit为true,同时发送一个两秒延迟消息,两秒后isExit为false,这样当消息未发送出去前的两秒,再次后退 便可退出程序

 1 @Override
 2     public boolean onKeyDown(int keyCode, KeyEvent event) {
 3
 4         switch (keyCode){
 5
 6
 7             case KeyEvent.KEYCODE_BACK:
 8
 9                 if(isExit){
10
11                     return super.onKeyDown(keyCode, event);
12                 }else {
13
14                     Toast.makeText(this, "再按一下退出程序", Toast.LENGTH_SHORT).show();
15                     isExit = true;
16
17                     new Thread(new Runnable() {
18
19                         @Override
20                         public void run() {
21
22                             try {
23
24                                 Thread.sleep(2000);
25
26                                 isExit = false;
27
28                             } catch (InterruptedException e) {
29                                 e.printStackTrace();
30                             }
31
32                         }
33
34                     }).start();
35                     return false;
36                 }
37
38             default:
39                 return super.onKeyDown(keyCode, event);
40
41         }
42     }

Android项目实战(二):安卓应用程序退出的三种方法相关推荐

  1. android 国内 更新方法,手机安卓系统怎么升级 安卓系统更新升级的三种方法介绍...

    最近有网友问小编"安卓系统怎么升级?",针对该问题,笔者也在网上查找了下相关资料,不过并没有找到什么有价值的相关介绍,多数都是介绍如何自动升级.或者下载升级版包等等方法,对于一些常 ...

  2. android系统通过图片绝对路径获取URI的三种方法

    老马的技术博客 android系统通过图片绝对路径获取URI的三种方法 最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1. ...

  3. python记录程序运行时间的三种方法

    这里提供了python记录程序运行时间的三种方法,并附有实现代码,最后进行比较,大家参考下: 方法1 import datetime starttime = datetime.datetime.now ...

  4. UG\NX二次开发 获取相切面的三种方法

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG\NX二次开发 获取相切面的三种方法 方法1: 使用NX Open C++ 的面 ...

  5. android修改密码功能,安卓手机设置开机密码几种方法介绍

    安卓系统的手机设置开机密码一般有2-3种,其中包括密码锁.图案锁.PIN密码锁等几项.这几项都能实现开机需要输入相应的密码才能使用手机的,所以也算是开机锁了.好了,下面小编就教大家怎么设置这几种锁. ...

  6. 【原】动态申请二维数组并释放的三种方法

    在C++中实现变长数组 一般来说,有三种方法来申请多维数组:C的malloc/Free    C++的new/delete    STL容器Vector 1.变长一维数组 这里说的变长数组是指在编译时 ...

  7. android stringbuilder清空,StringBuffer 清空StringBuffer的实例的三种方法

    @Test public void testStringbuffer(){ //StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例: Str ...

  8. 【java】springboot项目启动数据加载内存中的三种方法

    文章目录 一.前言 二.加载方式 2.1. 第一种:使用@PostConstruct注解(properties/yaml文件). 2.2. 第二种:使用@Order注解和CommandLineRunn ...

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

    1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid())    //获取PID,目前获取自己的也只有该A ...

最新文章

  1. 含有PCA动画演示的帖子,需要多读几遍的经典
  2. Android的Framework分析---4硬件抽象HAL
  3. tiny4412的烧录工具minitool安装【学习笔记】
  4. 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...
  5. 如何自己用U盘重装系统
  6. B站就机房服务器故障道歉;罗永浩否认将启动自动驾驶项目;​亚马逊收购 Facebook 卫星互联网团队|极客头条...
  7. Firefox6 使用 firebug 解决方法 以及迅雷(thunder)插件报错
  8. C++11基于范围的for循环
  9. MT2503处理器性能介绍,MT2503/MT2503A/MT2503D芯片资料下载
  10. 【数字图像处理matlab】sobel、prewitt算子图像锐化
  11. 如何写毕业设计——开题报告
  12. OpenWrt配置阿里云动态域名服务DDNS
  13. The project uses Gradle 4.1 which is incompatible with Java 11 or newer.
  14. 多次请求后tomcat网页假死
  15. 跟着Cell学作图| 11.Ingenuity Pathway Analysis(IPA)
  16. RuoYi-Vue——Swagger文档401问题
  17. 效率UP!机器学习从废品中分拣可回收材料;计算机科学自学计划▪中译版;Python入门指南;好用的代码自动补全工具;前沿论文 | ShowMeAI资讯日报
  18. Python Matplotlib设置x轴与y轴相交于心仪的坐标点
  19. 实现 酷狗音乐 歌词播放效果
  20. 造价猫工程预算视频教程-ET型楼梯钢筋计算,实例解读

热门文章

  1. 详细分析开源软件 ExifTool 的任意代码执行漏洞 (CVE-2021-22204)
  2. Apache Struts 修复 OGNL 技术中可能存在的 RCE 缺陷
  3. thinkphp源码分析(三)—自动加载篇(Loader的分析)
  4. [Bzoj3252]攻略(dfs序+线段树)
  5. 分布式监控系统Zabbix--使用Grafana进行图形展示
  6. Linux文件管理和用户管理
  7. 谈谈OAB离线地址簿无法更新问题?(服务器是Exchange 2007和Exchange 2010)
  8. 数据操纵:SELECT, INSERT, UPDATE, DELETE
  9. c/c++函数指针(3)
  10. web:网站性能工具Yslow