Android 启动模式二---组合Flag和launchMode

之前的文章讲了4种launchMode启动的Activity的区别以及通过设置taskAffinity来新建一个任务栈(launchMode 是singleTask 或 singleInstance)

一个实例让你理解android的4种启动模式

几种主要的Flag

1. Intent.FLAG_ACTIVITY_NEW_TASK

首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性相同),如果有,则直接把这个栈整体移动到前台,并保持栈中之前的activity的顺序不变,然后被启动的Activity会被压入栈(不管栈中是否已经有该Activity),如果没有,则新建一个栈来存放被启动的activity,注意,默认情况下同一个应用中的所有Activity拥有相同的关系(taskAffinity).

2. Intent.FLAG_ACTIVITY_CLEAR_TASK

该模式必须配合FLAG_ACTIVITY_NEW_TASK一起使用,效果就是:
如果目标task已经存在,将清空已存在的目标Task,否则,新建一个Task栈,之后,新建一个Activity作为根Activity。Intent.FLAG_ACTIVITY_CLEAR_TASK的优先级最高,基本可以无视所有的配置,包括启动模式及Intent Flag,哪怕是singleInstance也会被finish,并重建。

即 如果 A 以intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 来启动 B,而且B没有设置taskAffinity,那么就会清空A所在的任务栈,然后新建B作为根Activity。如果B设置了taskAffinity且值不等于包名(表示需要创建一个新的任务栈),那么结果就是新建一个任务栈,然后创建B作为该任务栈的根Activity.。

3. Intent.FLAG_ACTIVITY_CLEAR_TOP

1、如果单独使用Intent.FLAG_ACTIVITY_CLEAR_TOP,并且没有设置特殊的launchmode,那么,Google官方的示例是:如果ABCD Task中的D采用Intent.FLAG_ACTIVITY_CLEAR_TOP唤起B,这个时候首先会将CD出栈,但是至于B是否会重建,要视情况而定,如果任务栈之前启动的B没有设置FLAG_ACTIVITY_SINGLE_TOP 或B的launchMode没有设置为singleTop,则会将B finish掉,之后创建新的B入栈。
如果任务栈之前启动的B设置FLAG_ACTIVITY_SINGLE_TOP 或B的launchMode设置为singleTop,则不会创建新的B,而是直接调用B的 onNewIntent方法。

2.如果不在同一个任务栈中,通过该方式启动Activity,则新新建一个Activity放到启动它的Activity所在的栈中,如 A启动B,B通过设置了taskAffinity和launchMode = "singleTask"启动C,那么C就在另外一个任务栈了(假设任务栈为Task2),这时候C通过设置Intent.FLAG_ACTIVITY_CLEAR_TOP 启动B,那么C就会新建一个B放到Task2中。

3 . 同时设置 Intent.FLAG_ACTIVITY_NEW_TASK,如果此时任务栈中包含该Activity,那么就会唤起该任务栈,并将该Activity自身及上面的Activity出栈,然后新建该Activity入栈。即 A 启动 B(都在任务栈Task1),B通过设置了taskAffinity和launchMode = "singleTask"启动C,那么C就在另外一个任务栈了(假设任务栈为Task2),此时,C 通过intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK) 启动A,由于A存在Task1中,那么将任务栈Task1唤起,将A及A上面的B出栈,然后新建 A加入Task1,那么此时的任务栈是Task1在Task2前面。下图可以看看:
Android 启动模式二---组合Flag和launchMode_第1张图片
4.同时加上Intent.FLAG_ACTIVITY_SINGLE_TOP,如果跳转的Activity存在于任务栈中且在栈顶,那么就会唤起该任务栈,然后调用目标Activity的 onNewIntent。
例如: 任务栈1中有 A------B-------C, C设置了taskAffinity和launchMode = "singleTask"启动D,D启动E,任务栈2中有 D-------E,E 以 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP) 启动C,那么唤起C所在的任务栈1,由于C在栈顶,那么复用C即调用C的 onNewIntent.

4. Intent.FLAG_ACTIVITY_SINGLE_TOP

Intent.FLAG_ACTIVITY_SINGLE_TOP多用来做辅助作用,跟launchmode中的singleTop作用一样,在Task栈顶有的话,就不新建,栈顶没有的话,就新建,这里的Task可能是目标栈,也可能是当前Task栈,配合FLAG_ACTIVITY_NEW_TASK及FLAG_ACTIVITY_CLEAR_TOP都会有很有意思的效果。

你可能感兴趣的:(移动开发)