Android项目实战(二):安卓应用程序退出的三种方法
现在的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 }
全部代码:
![](https://yqfile.alicdn.com/img_1c53668bcee393edac0d7b3b3daff1ae.gif)
![](https://yqfile.alicdn.com/img_405b18b4b6584ae338e0f6ecaf736533.gif)
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项目实战(二):安卓应用程序退出的三种方法相关推荐
- android 国内 更新方法,手机安卓系统怎么升级 安卓系统更新升级的三种方法介绍...
最近有网友问小编"安卓系统怎么升级?",针对该问题,笔者也在网上查找了下相关资料,不过并没有找到什么有价值的相关介绍,多数都是介绍如何自动升级.或者下载升级版包等等方法,对于一些常 ...
- android系统通过图片绝对路径获取URI的三种方法
老马的技术博客 android系统通过图片绝对路径获取URI的三种方法 最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1. ...
- python记录程序运行时间的三种方法
这里提供了python记录程序运行时间的三种方法,并附有实现代码,最后进行比较,大家参考下: 方法1 import datetime starttime = datetime.datetime.now ...
- UG\NX二次开发 获取相切面的三种方法
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG\NX二次开发 获取相切面的三种方法 方法1: 使用NX Open C++ 的面 ...
- android修改密码功能,安卓手机设置开机密码几种方法介绍
安卓系统的手机设置开机密码一般有2-3种,其中包括密码锁.图案锁.PIN密码锁等几项.这几项都能实现开机需要输入相应的密码才能使用手机的,所以也算是开机锁了.好了,下面小编就教大家怎么设置这几种锁. ...
- 【原】动态申请二维数组并释放的三种方法
在C++中实现变长数组 一般来说,有三种方法来申请多维数组:C的malloc/Free C++的new/delete STL容器Vector 1.变长一维数组 这里说的变长数组是指在编译时 ...
- android stringbuilder清空,StringBuffer 清空StringBuffer的实例的三种方法
@Test public void testStringbuffer(){ //StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例: Str ...
- 【java】springboot项目启动数据加载内存中的三种方法
文章目录 一.前言 二.加载方式 2.1. 第一种:使用@PostConstruct注解(properties/yaml文件). 2.2. 第二种:使用@Order注解和CommandLineRunn ...
- Android程序完全退出的三种方法
1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid()) //获取PID,目前获取自己的也只有该A ...
最新文章
- 含有PCA动画演示的帖子,需要多读几遍的经典
- Android的Framework分析---4硬件抽象HAL
- tiny4412的烧录工具minitool安装【学习笔记】
- 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...
- 如何自己用U盘重装系统
- B站就机房服务器故障道歉;罗永浩否认将启动自动驾驶项目;​亚马逊收购 Facebook 卫星互联网团队|极客头条...
- Firefox6 使用 firebug 解决方法 以及迅雷(thunder)插件报错
- C++11基于范围的for循环
- MT2503处理器性能介绍,MT2503/MT2503A/MT2503D芯片资料下载
- 【数字图像处理matlab】sobel、prewitt算子图像锐化
- 如何写毕业设计——开题报告
- OpenWrt配置阿里云动态域名服务DDNS
- The project uses Gradle 4.1 which is incompatible with Java 11 or newer.
- 多次请求后tomcat网页假死
- 跟着Cell学作图| 11.Ingenuity Pathway Analysis(IPA)
- RuoYi-Vue——Swagger文档401问题
- 效率UP!机器学习从废品中分拣可回收材料;计算机科学自学计划▪中译版;Python入门指南;好用的代码自动补全工具;前沿论文 | ShowMeAI资讯日报
- Python Matplotlib设置x轴与y轴相交于心仪的坐标点
- 实现 酷狗音乐 歌词播放效果
- 造价猫工程预算视频教程-ET型楼梯钢筋计算,实例解读
热门文章
- 详细分析开源软件 ExifTool 的任意代码执行漏洞 (CVE-2021-22204)
- Apache Struts 修复 OGNL 技术中可能存在的 RCE 缺陷
- thinkphp源码分析(三)—自动加载篇(Loader的分析)
- [Bzoj3252]攻略(dfs序+线段树)
- 分布式监控系统Zabbix--使用Grafana进行图形展示
- Linux文件管理和用户管理
- 谈谈OAB离线地址簿无法更新问题?(服务器是Exchange 2007和Exchange 2010)
- 数据操纵:SELECT, INSERT, UPDATE, DELETE
- c/c++函数指针(3)
- web:网站性能工具Yslow