如何安全退出已调用多个 Activity 的 Application?

  • 记录打开的Activity

    • 每打开一个Activity,就记录下来,在需要退出时,关闭每一个activity。
  • 发送特定的广播
    • 在需要结束应用时,发送一个特定的广播,每一个Activity收到广播后关闭。
  • 通过 intent 的 flag 来实现
    • 实现intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 激活
      一个新的 activity。此时如果该任务栈中已经有该 Activity,那么系统会把这个 Activity 上面的所有 Activity 干掉。其实相当于给 Activity 配置的启动模式为 SingleTop。

这里我们就来看看第一种方法是如何实现的

1.创建一个类(MyApplication)继承Application

public class MyApplication extends Application{

2.创建一个用于存放activity的集合,这里可以创建一个Activity的基类,叫BaseActivty,让所有的Activity都继承它,在BaseActivity中我们可以写共性的方法或变量等。

//创建一个用于存放Activitiy的集合List<BaseActivity> mActivityList = new ArrayList<>();

3.添加3个方法,分别用于添加Activity,移除Activity,清空集合

  //提供一个添加activity的方法public void addActivity(BaseActivity activity) {if (!mActivityList.contains(activity)) {mActivityList.add(activity);}}//提供一个移除activity的方法public void removeActivity(BaseActivity activity) {if (!mActivityList.contains(activity)) {mActivityList.remove(activity);}}//提供一个清空集合的方法public void clearAllActivity() {for (int i = 0; i< mActivityList.size(); i++) {BaseActivity activity = mActivityList.get(i);activity.finish();}mActivityList.clear();}

到此,我们的MyApplication就实现了以上的功能,接下来只需要在BaseActivity中调用就可以了。


1.首先在onCreate方法中,获取到MyApplication的对象,并调用addActivity()方法。

public class BaseActivity extends AppCompatActivity{private MyApplication mApplication;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mApplication = (MyApplication) getApplication();mApplication.addActivity(this);    //一旦创建了一个Activity,那么就加入到集合中}

2.其次,在BaseActivity的onDestroy()方法中,我们将该Activity移除

 @Overrideprotected void onDestroy() {super.onDestroy();mApplication.removeActivity(this);//移除Activity}

写到这里,我们发现clearAllActivity()这个方法,该怎么被调用呢,如果我们退出了一个应用,那么自然的Activity都被销毁了,并且在实际开发中,按返回键,最后都会回到主界面的Activity中,然后,再连按两下,应用就退出了,这个在我们生活中很常见。

那么这个是怎么实现的呢?

其实就是在Activity的onBackPressed()方法中,计算出两次点击的时间差,如果在2秒内点击2次,就退出,否则就弹出Toast提示。

private long mStartTime;    //定义一个成员变量,默认初始时间为0@Overridepublic void onBackPressed() {super.onBackPressed();//当点击的时候计算2次点击的时间差,如果在2秒之内点击2次,就退出long currentTimeMillis = System.currentTimeMillis();if ((currentTimeMillis - mStartTime) < 2000) {this.finish();} else {Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();mStartTime = System.currentTimeMillis();    //记录点击后的时间}}

好,我们回过来,在实际应用中,安全退出已调用多个Activity的Application,在某个应用场景下非常常见,那就是当你的账号在其他设备上登录了,那你这边的账号就会断开,并且重新跳转到登录界面,这个时候我们就要清空我们所有的任务栈。

在利用环信的sdk进行社交类应用的开发时,看到环信提供了一个监听的回调方法,我们可以重写其中的onDisconnected(int i),代码如下:

EMClient.getInstance().addConnectionListener(new EMConnectionListener() {@Overridepublic void onConnected() {}@Overridepublic void onDisconnected(int i) {final Intent intent = new Intent(getApplicationContext(),LoginActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//在非activity中,要唤起一个activity,就要重现创建一个任务栈//客户端和服务器断开连接了if(i == EMError.USER_REMOVED){// 显示帐号已经被移除//跳转到登录界面handler.post(new Runnable() {@Overridepublic void run() {ToastUtil.showToast(getApplicationContext(),"您已被后台删除,请重新登录或注册!");//清空所有任务栈clearAllActivity();startActivity(intent);}});}else if (i == EMError.USER_LOGIN_ANOTHER_DEVICE) {// 显示帐号在其他设备登录//跳转到登录界面handler.post(new Runnable() {@Overridepublic void run() {ToastUtil.showToast(getApplicationContext(),"您的账号已经在另外一台设备登录,请重新登录!");//清空所有任务栈clearAllActivity();startActivity(intent);}});}

第一次用markdown写,格式丑请见谅。
欢迎指正错误。

如何安全退出已调用多个 Activity 的 Application?相关推荐

  1. 如何退出Activity?如何安全退出已调用多个Activity的Application?

    对于单一Activity的应用来说,退出很简单,直接finish()即可. 1.抛异常强制退出: 该方法通过抛异常,使程序ForceClose. 验证可以,但是,需要解决的问题是,如何使程序结束掉,而 ...

  2. 安全退出调用多个Activity的Application

    记录调用的Acticity 使用一个list将打开的Activity都存起来,统一finish(). 发送特定广播 为此App下的Acticity定义一个特定广播,当发送此广播时Activity执行f ...

  3. 调用另一个Activity

    参考自Google官方文档Traning/Getting Started/Building a simple user interface, Startinganother activity,http ...

  4. Activity启动流程(六)注册目标Activity进程到system_server进程以及创建目标Activity进程Application

    注册Activity应用进程到system_server以及创建Activity应用进程Application Android四大组件源码实现详解系列博客目录: Android应用进程创建流程大揭秘 ...

  5. python调用外部程序 退出_Python调用(运行)外部程序

    在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32pro ...

  6. Android中调用另一个Activity并返回结果-以模拟选择头像功能为例

    场景 Android中点击按钮启动另一个Activity以及Activity之间传值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  7. java向另一activity输入_Android中调用另一个Activity并返回结果-以模拟选择头像功能为例...

    场景 Android中点击按钮启动另一个Activity以及Activity之间传值: 在上面启动Activity和传值之后,怎样获取Acitvity的返回值.下面示例实现点击选择头像按钮,跳转到头像 ...

  8. Android之退出应用关闭项目每个Activity的总结

    思路 我们先封装好一个类叫MyApplication这个类,把这个类设置为单例模式,只有一个对象,然后在这个类里面写一个能装Activity的集合,相当于一个栈,然后每次有activity的时候,就去 ...

  9. Android调用第三方App Activity

    在App A中调用App B的Activity1.需要做两方面的配置. (1)App B要表明,Activity1是对外可见的,或是可以被启动的Activity. 可在AndroidManifest. ...

最新文章

  1. SSM项目各层单元测试
  2. 我一个普通程序员,光靠GitHub打赏就年入70万,要不你也试试
  3. gcc编译c程序,既然第一步把头文件包含进来了为什么还要进行第四步链接,链接的是什么?...
  4. 区块链常用架构是什么?它和保险业又如何结合?
  5. java jar包收集
  6. python进阶-Python 进阶用法 (持续更新)
  7. 第三周笔记 c++ Boolan
  8. This is Huge! PhysBAM code is going to be released?
  9. 软件_mongo占用磁盘空间过大
  10. Reeder for Mac 5.1 优秀的RSS阅读器
  11. Unity快速安装教程
  12. APP性能测试(手机端和服务端)
  13. [导入]MPQ 文件系统完成
  14. revel MySQL_Revel 教程
  15. 读一封汶川地震的信:亲爱的,我要和别人结婚了
  16. 腾讯云永久修改主机名
  17. 你该知道的Pyecharts简易上手教程
  18. 普通人存多少钱才能不焦虑?
  19. 阿里云服务器与腾讯云服务器的故事
  20. 详解 PerformanceResourceTiming API,咦,这货真的干!

热门文章

  1. DuerOS - DuerOS对话式人工智能系统唤醒
  2. 《开源安全运维平台OSSIM最佳实践》当当自营店 3-15活动 ,仅售 6 折
  3. 【微信小程序封装底部弹出框二】
  4. access怎么查询工龄_ACCESS查询操作题及答案详解.doc
  5. H5视频会议、WebRtc视频会议--基于webrtc视频通话及屏幕共享
  6. 借呗被突然关闭了,是什么原因?怎么办?
  7. 微信小程序省市区联动,自定义地区字典
  8. 57- 打印钻石图形
  9. Linux:内存情况处理
  10. android的一个下载框架Aria