Android实现点击两次返回退出APP

Android实现点击两次返回退出APPAndroid实现点击两次退出APP这两天在做一个项目碰到这么个问题,需要主界面点击两次直接退出整个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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154752.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SqlSugar ORM 入门篇2 【查询】 让我们实现零SQL「建议收藏」

    SqlSugar ORM 入门篇2 【查询】 让我们实现零SQL「建议收藏」SqlSugar在查询的功能是非常强大的,多表查询、分页查询、一对一查询、二级缓存、一对多查、WhenCase等复杂函数、Mapper功能、和拉姆达自定义扩展等,用好了是可以做到真正零SQL的一款

    2022年8月4日
    8
  • java中中文乱码_java中中文乱码怎么解决?「建议收藏」

    java中中文乱码_java中中文乱码怎么解决?「建议收藏」java中中文乱码解决方法:一、设置工作空间的编码1、编辑器的编码会影响到所有的项目中的字符的显示,可以说是作用最为广泛的设置,每一个项目都会受到这个设置的影响。点击菜单栏中的窗口(Window)——选项(Preferences)。2、点击常规(General)——工作空间(Wordspace),然后在右侧的文本文件编码格式(Textfileencoding)中选择你想要设置的编码格式,系…

    2022年7月7日
    162
  • idea注释模版配置(吐血推荐!!!)[通俗易懂]

    idea注释模版配置(吐血推荐!!!)[通俗易懂]idea注释模版配置idea作为越来越多程序员使用的开发工具,平时的代码注释也非常的关键,下面介绍一下类上注释和方法上注释,方便大家的开发配置,同时也为自己以后配置留一份记录(毕竟每次换环境都需要重新配置一遍)1、新建类的时候自动添加类注释(1)按照上图的提示,找到位置1的FileandCodeTemplates(2)选择右侧的Files选项卡,选择位置2的Class(如果需要设置接口和枚举的注释模版,只需要选择Interface和Enum,按照步骤3配置一下就ok了)(3)在

    2022年9月30日
    3
  • php sql filestream,FileStream应用

    php sql filestream,FileStream应用FileStream:文件流,为了解决大对象BLOB(BinaryLargeObjects)的存储问题.对于大对象存储,并且不受2GB的限制.以往有两种方式:(1)存储在数据库里面,这种方式一般使用image字段,或者varbinary(max)来做,好处是可以统一备份,但实际效率较低;(2)存储在文件系FileStream:文件流,为了解决大对象BLOB(BinaryLargeOb…

    2022年7月24日
    7
  • html 下拉导航栏源码,html导航栏下拉菜单怎么制作?这里有详细的代码实例「建议收藏」

    html 下拉导航栏源码,html导航栏下拉菜单怎么制作?这里有详细的代码实例「建议收藏」元素来包裹这些元素,并使用CSS来设置下拉内容的样式。html导航栏菜单的CSS部分:.dropdown类使用position:relative,这将设置下拉菜单的内容放置在下拉按钮(使用position:absolute)的右下角位置。.dropdown-content类中是实际的下拉菜单。默认是隐藏的,在鼠标移动到指定元素后会显示。注意min-width的值设置为160px。你可以随意修改它…

    2022年5月24日
    92
  • latex希腊字母对照表_24个希腊字母怎么读

    latex希腊字母对照表_24个希腊字母怎么读LATEXL^AT_EXLATE​X希腊字母对照表显示输入显示输入α\alphaα\alphaβ\betaβ\betaγ\gammaγ\gammaδ\deltaδ\deltaε\varepsilonε\varepsilonη\etaη\etaθ\thetaθ\thetaι\iotaι\iotaκ\kappaκ\kappaλ\lambdaλ\lambdaμ\muμ\muν\nuν\nuξ\xiξ\xiooo

    2022年10月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号