Android实现点击两次返回退出APP
Android实现点击两次退出APP
这两天在做一个项目碰到这么个问题,需要主界面点击两次直接退出整个APP而不是返回上一个界面,查找了网上的资料,整合和修改了一下写了这篇博客。
这里我主要以我的项目为例,实现了登录界面,注册界面,在登录界面登录成功则跳转到主界面上,而主界面点击退出回到了登录界面,这显然是不合理的,需要主界面点击返回按钮退出整个APP,同时为了防止误触,还应该实现点击一次提醒用户,点击两次退出整个APP,市面上的大多APP也是这么干的,这样的用户体验也会更好。
话不多说,我们来看代码
1、实现活动的集合类
这里主要实现点击返回按钮退出程序的功能,也会是随时随地退出程序。
新建一个ActivityCollector类作为活动管理器,代码如下:
import android.app.Activity; import java.util.ArrayList;
import java.util.List; //提供一个专门的集合类对所有的活动进行管理
//方便随时退出程序
public class ActivityCollector { public static List<Activity> sActivities=new ArrayList<>(); public static void addActivity(Activity activity){
sActivities.add(activity);
} public static void removeActivity(Activity activity){
sActivities.remove(activity);
} public static void finishAll(){
for(Activity activity:sActivities){
if(!activity.isFinishing()){
activity.finish();
}
}
sActivities.clear();
}
}
在活动管理器中,我们通过一个Activity的List来暂存活动,addActivity()方法向其中添加活动,removeActivity()方法移除活动,最后提供了一个finishAll()方法用于将List中的活动全部销毁。
接下来修改主界面之前的活动,这里我主要是在登录界面和注册界面中添加了如下代码:
public class XXXXActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy(){
super.onDestroy();
ActivityCollector.removeActivity(this);
}
接着在启动主界面的 Intent 后需要添加下面这行代码:
ActivityCollector.finishAll();
这样在主界面上点击返回按钮会直接退出整个APP。
其实上面这些代码的主要作用就是让新活动入栈的之前清空活动栈,这样当新活动入栈后活动栈内只有一个活动,点击返回按钮当然就能直接退出程序。
接下来我们来实现点击两次退出APP
2、实现点击两次退出APP
网上实现的代码主要是两种方式:
(1)、利用Handler
(2)、利用系统秒数
这两个方法的核心其实都是利用时间差,如果在限定的时间内点击了两次返回键就退出程序。
这里我忍不住想吐槽一下网上的代码,很多人转的都是同一份代码,然而那份代码有个错误不能正常运行,只需要改动一下就可以使用,希望大家在转博客的时候也能先运行一下,能运行通过的再转,别搞的搜到的都是错误的代码。
这里给出两种方法实现的代码:
(1)、利用Handler
代码如下
//定义一个变量,来标识是否退出
private static int isExit=0; //实现按两次后退才退出
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
isExit--;
}
}; @Override
public boolean onKeyDown(int keyCode, KeyEvent event){
if(keyCode==KeyEvent.KEYCODE_BACK){
isExit++;
exit();
return false;
}
return super.onKeyDown(keyCode,event);
} private void exit(){
if(isExit<2){
Toast.makeText(getApplicationContext(),R.string.Exit,Toast.LENGTH_SHORT).show(); //利用handler延迟发送更改状态信息
handler.sendEmptyMessageDelayed(0,2000); }else{
super.onBackPressed();
}
}
这里我简略介绍一下这个代码。
首先定义一个整型变 isExit 量来记录返回按钮的点击次数,默认为0。接下来创建一个Handler,用来处理发送过来的信息,这是 Android 提供的一套异步消息处理机制,在子线程中更新UI也会用到这一套机制,接触过AsyncTask的人应该对于这个比较了解,AsyncTask实际上就是基于异步消息处理机制,只是Android帮我们做了很好的封装而已。
重写了父类的onKeyDown()方法,每点击一次返回按钮就会调用这个方法,给 isExit 的值增加1,调用 exit() 判断是否要退出程序。第一次点击时 isExit 的值增加1,其值为1,调用 exit() ,弹出提示框提醒用户再点击一次退出程序,并调用刚才创建的 handler 发送修改 isExit 为0,这里设置其延时2秒发送,如果2秒之内用户再次点击,又会给 isExit 的值增加1,这是调用 exit() 方法会直接调用 super.onBackPressed() 方法直接退出程序,显然上面发送的消息也到不了 handler 里面,程序也就可以正常退出。如果2秒内用户没有再次点击返回键,isExit的值再次置为0,用户则需要再次点击两次返回键方能退出程序。
(2)、利用系统秒数
代码如下:
private static final int TIME_EXIT=2000;
private long mBackPressed; @Override
public void onBackPressed(){
if(mBackPressed+TIME_EXIT>System.currentTimeMillis()){
super.onBackPressed();
return;
}else{
Toast.makeText(this,"再点击一次返回退出程序",Toast.LENGTH_SHORT).show();
mBackPressed=System.currentTimeMillis(); }
}
这个方法比上面的原理还要简单些,这里就不再赘述了。
这里我解释一下为什么没直接调用用 finsh() 或则是直接使用 System.exit(0),网上很多的代码都是这样做的。
在 Android 开发网的文档上我们可以找到给 finish() 的介绍:
You can shut down an activity by calling its finish() method.
You can also shut down a separate activity that you previously started by calling finishActivity(). Note: In most cases, you should not explicitly finish an activity using these methods.
As discussed in the following section about the activity lifecycle, the Android system manages the life of an activity for you,
so you do not need to finish your own activities.
Calling these methods could adversely affect the expected user experience and
should only be used when you absolutely do not want the user to return to this instance of the activity.
Android官方也并不建议我们使用这种方法,使用过的也应该知道使用这种方法直接退出的效果很差,并不像 Android 自带应用退出时的动画那么流畅,所以建议不使用这个方法。
至于System.exit(0),这个方法就更不建议了。
本文系原创,转载还请注明出处。
本文主要参考了:
1、《Android 第一行代码》第二版,郭霖著;
2、https://www.cnblogs.com/jojodru/p/5443303.html
Android实现点击两次返回退出APP的更多相关文章
- Android Studio 点击两次返回键,退出APP
该功能的实现没有特别复杂,主要在onKeyDown()事件中实现,直接上代码,如下: //第一次点击事件发生的时间 private long mExitTime; /** * 点击两次返回退出app ...
- 【转】Android实现点击两次返回键退出
在做安卓应用是我们经常要判断用户对返回键的操作,一般为了防止误操作都是在用户连续按下两次返回键的时候提示用户是否退出应用程序. 第一种实现的基本原理就是,当按下BACK键时,会被onKeyDown捕获 ...
- [Irving] Android 点击两次返回退出系统
Activity 中定义成员变量: private Long firstClickTime = 0l; //记录第一次点击时间 重载OnKeyDown方法 代码: @Override public b ...
- Flutter点击两次返回键退出APP
在APP中一些页面为了防止用户操作失误点击到返回键导致退出APP,可以设置其一定时间内点击两次返回键才允许退出APP,完成这个功能可以通过WillPopScope和SystemNavigator.po ...
- Android点击两次返回退出程序
代码改变世界 Android点击两次返回退出程序 private long mExitTime; public boolean onKeyDown(int keyCode, KeyEvent even ...
- 通过广播关闭应用程序(每个Activity)和连续点击两次返回键关闭应用程序
对于一个应用程序可能有很多个Activity,可能每个人并不想一个个的去关闭Activity,也有可能忘了,那怎么关闭所有的未关闭的Activity呢,其实有很多方法,但是我最喜欢的一种就是通过广播事 ...
- Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序
如需转载,请注明出处:Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序 在实际开发中,为了防止用户误触返回按钮导致程序退出,通常会设置为在1秒内连 ...
- Unity3D-实现连续点击两次返回键退出游戏(安卓/IOS)
Unity3D-连续点击两次返回键退出游戏 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Count ...
- vue 用huilder打包APP时,安卓按返回键就退出App改为按两次再退出App
做vue项目时,用Hbuilder打包APP,在安卓下按返回键就是退出了APP,百度了下.都是使用到MUI来解决的,自己也记录下. 在main.js里面引入mui.js并使用. import mui ...
随机推荐
- hihocoder 在线测试 补提交卡 (Google)
题目1 : 补提交卡 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过去 ...
- 使用pip安装第三方库报错记录
今天在使用pycharm导入第三方库的时候,报了好多超时错误,还有标题中的找不到版本,应该是网络的原因,记录下解决的办法: raise ReadTimeoutError(self._pool, Non ...
- SpringBoot2.0之整合ActiveMQ(点对点模式)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- github添加ssh公钥
使用git作为版本维护工具非常方便,而且一般个人用github作为远端库就够用了.而一般git连接github的方式采用ssh的方法,http的会略微慢一些.所以为了方便一般会在github设置中添加 ...
- Java微信公众平台开发_04_自定义菜单
一.本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装. 2.数据传输格式—JSON 自定义菜单中请求包的数据是Json字符串格式的,请参见: Java_数据 ...
- springmvc的简单介绍以及springmvc组件的介绍
Spring web mvc框架 什么是springmvc Springmvc是spring框架的一个模块,spring和springmvc无需中间整合层整合 Springmvc是一个基于mvc的we ...
- P2463 [SDOI2008]Sandy的卡片[差分+串拼接后缀数组]
P2463 [SDOI2008]Sandy的卡片 套路都差不多,都是差分后二分答案找lcp.只是这题要把多个串拼接起来成为一个大串,中间用某些值域中没有的数字相隔(最好间隔符都不一样想想为什么),排序 ...
- 【Lintcode】106.Convert Sorted List to Balanced BST
题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height ...
- Java网络与多线程系列之1:实现一个简单的对象池
前言 为什么要从对象池开始呢,先从一个网络IO操作的demo说起 比如下面这段代码,显而易见已经在代码中使用了一个固定大小的线程池,所以现在的重点在实现Runnble接口的匿名对象上,这个对象每次创建 ...
- C#窗体上绘制矩形
先上效果图 鼠标三个事件 private void Form1_MouseDown(object sender, MouseEventArgs e) { //记录开始点 this.mousedown ...