Intent.FLAG_ACTIVITY_NEW_TASK的理解
首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性相同),如果有,则直接把这个栈整体移动到前台,并保持栈中旧activity的顺序不变,然后被启动的Activity会被压入栈,如果没有,则新建一个栈来存放被启动的activity,注意,默认情况下同一个应用中的所有Activity拥有相同的关系(taskAffinity).
默认情况下同一个应用中的所有Activity,都拥有相同的关系(taskAffinity),即由FLAG_ACTIVITY_NEW_TASK开启的新Activity,也都在同一个任务栈中(与Application相同的任务栈),若想使新Activity进入不同栈中,则还需要如下配置:
<activity
android:name=".ui.activity.OtherTaskActivityXXX"
android:taskAffinity="android.task.browser"/>
并且在该OtherTaskActivityXXX页面中,若再开启的其他页面,那么所有的其他页面,都将被压入到这个新的任务栈中。
singleTask的理解
- 使用singletask并不会创建新的任务栈(Task),也就是TaskId是一样的。
- 如果它已经存在于栈中,再次请求触发此Activity时,会调用此类实例的onNewIntent方法,不会重新创建新的实例,即不会走onCreate方法。
- 如果它已经存在于栈中,再次请求触发此Activity时,那么其之上的Activity会全部出栈。比如当前栈栈内有A->B->C->D,B是singletask,其他均为standard,再次启动B时,C和D出栈,栈变为A->B。
singleInstance的理解
- 如果此Activity没有实例,它会创建一个新的任务栈(新的TaskId),并把该Activity入栈。
- 如果任务栈中已经有此实例,会调用onNewIntent方法,不会创建新的任务栈和实例,即不会走onCreate方法。
taskAffinity属性
- taskAffinity值是一个字符串,可以指定为任意字符串,但是必须至少包含一个”.”,否则会报错
- taskAffinity 单独使用并不会生效。要想其生效,需要配合其他属性使用比如设置launchmode为singleTask或者singleInstance(singleInstance强制会在新的task),或者配合 Intent.FLAG_ACTIVITY_NEW_TASK,或者配合
allowTaskReparenting 。使用时用其中的一个就行。 - 一些应用:https://www.cnblogs.com/ldq2016/p/6953106.html
- 测试实例:https://www.jianshu.com/p/41dd76c3463d
Activity的各种finish
- finish ():finish ()方法在你的activity结束或者应该被关闭时调用。ActivityResult将通过onActivityResult()方法传递给启动者。这是比较常用的关闭Activity的方法。
- finishActivity (int requestCode):强制关闭另一个先前通过startActivityForResult(Intent, int)启动的Activity。
- finishAffinity ():关闭该Activity和同一栈中的所有位于该Activity下面的Activity。比如说在同一Activity栈中,Activity A启动了Activity B,Activity B启动了Activity C。Activity B调用finishAffinity()方法,会关闭 Activity A和 Activity B,Activity C仍然存在。如果Activity C调用该方法,则A,B,C,都会被关闭,且如果应用只有这一个栈,那么C调用该方法会直接退出应用。
- finishActivityFromChild (Activity child, int requestCode):API level 13废弃
- finishAndRemoveTask ():关闭当前Activity且关闭该Activity作为根Activity的的任务。长按home在最近使用栈里面看不到该应用的任何栈,但是除了该activity的该应用的其他栈并不会清除