Android退出全部Activity最优雅的方式

关于退出全部Activity,目前网上比较流行的方式大概有如下几种:html

① 使用ActivityManager的方式;android

② 自定义一个Activity集合类的方式;ide

③ 经过发送广播的方式;this

④ 经过杀死当前应用进程的方式;url

以上方式的具体实现你们可自行谷歌百度,此处再也不赘述。spa

可是这些方式要么不太靠谱,要么有限制,要么不够优雅。今天咱们就来讲一个简单有效,优雅大方的方式来退出全部的Activity。code

原理htm

先来讲一下原理。咱们知道,Activity有四种启动模式,分别为:standard(默认模式)、singleTop、singleTask、singleInstance。本方式须要使用的就是singleTask启动模式。blog

若是设置一个Activity的启动模式为singleTask,那么每次启动此Activity时系统都会检查当前任务栈中是否已经存在此Activity的实例。若是已经存在,则再也不建立此Activity新的实例,而是调用已存在的Activity的onNewIntent()方法,并把intent做为此方法的参数传递给它。而后它就会被置于栈顶,并把它以前的全部的Activity移除掉。进程

原理实现

(咱们先将进入应用的第一个Activity称为BaseActivity)。明白了基本原理以后就好办了,先将BaseActivity的启动模式设置为singleTask,并重写此Activity的onNewIntent()方法用来结束本身,以后会在此Activity上进入其余Activity进行数量不定的跳转。在须要退出时只需在当前Activity上调用startActivity(this,BaseActivity.class)会首先将除BaseActivity外的全部Activity结束掉,而后会自动调用BaseActivity的onNewIntent()结束掉本身,这样全部Activity都完美的退出了。

图解实现

为了便于理解,使用下图演示此方式的具体实现过程。

代码实现

第一步:设置BaseActivity的启动模式为singleTask

android:launchMode="singleTask"

第二步:重写BaseActivity的onNewIntent()方法

//声明一个静态常量,用做退出BaseActivity的Tag
public static final String EXIST = "exist"; @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent != null) {//判断其余Activity启动本Activity时传递来的intent是否为空 //获取intent中对应Tag的布尔值
        boolean isExist = intent.getBooleanExtra(EXIST, false); //若是为真则退出本Activity
        if (isExist) { this.finish(); } } }

第三步:在须要退出应用的Activity中启动BaseActivity

Intent intent = new Intent(this,BaseActivity.class); //传递退出全部Activity的Tag对应的布尔值为true
intent.putExtra(BaseActivity.EXIST, true); //启动BaseActivity
startActivity(intent);
做者: caobotao
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文连接,不然保留追究法律责任的权利。
相关文章
相关标签/搜索