关于退出全部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);