Activity加载模式及Intent的FLAG使用总结

时间:2022-06-06 02:16:54
一、Activity的加载模式

1、stardard:默认的launchmode。使用此属性时,不管要启动的activity在当前task中是否已存在,系统都会在当前task的栈顶生成该activity的新的实例。

2、singleTop:若当前task的栈顶activity就是要启动的activity,则不会生成新的activity实例;否则,在当前task的栈顶生成新的该activity的实例。

3、singleTask:首先寻找是否有与要启动的activity具有相同affinity的task。若没有,则生成一个新的task,并将该activity放入其中(该新task的affinity就是该activity的affinity);若有,则判断该activity在该task中是否已存在,若存在,则销毁该activity之上的其他所有activity,若不存在,则直接将该activity添加到该task的栈顶。

4、singleInstance:启动一个新的task并将该activity放入其中,该task永远都只会容纳这个activity。若该activity再次启动该activity,则这个新的task不会生成该activity的新的实例。若该activity要启动activityB(activityB为默认的启动模式),则首先会寻找是否有与activityB具有相同affinity的task,若有,则将activityB添加到该task的栈顶;若没有,则创建一个新的task并将activityB放入其中。

 

二、Intent的FLAG

1、FLAG_ACTIVITY_NEW_TASK:首先寻找是否有与要启动的activity具有相同affinity的task。若没有,则生成一个新的task,并将该activity放入其中(该新task的affinity就是该activity的affinity);若有,则将该activity添加到该task的栈顶。

2、FLAG_ACTIVITY_SINGLE_TOP:同launch mode的singleTop。

3、FLAG_ACTIVITY_CLEAR_TOP:若该activity在该task中已存在,则销毁该activity之上的其他所有activity;若不存在,则直接将该activity添加到该task的栈顶。例如,FirstActivity跳转到SecondActivity,SecondActivity跳转到ThirdActivity,而ThirdActivity又跳到SecondActivity,那么ThirdActivity实例将被弹出栈,使SecondActivity处于栈顶,栈内只剩下FirstActivity和SecondActivity。这个SecondActivity既可以在onNewIntent()中接收到传来的Intent,也可以把自己销毁之后重新启动来接受这个Intent。在使用默认的“standard”启动模式下,它将关闭后重建;对于其他启动模式,它都将使用已存在的实例,Intent会被传递到这个实例的onNewIntent()中。即在standard模式下,如果原来的Activity栈顺序为 A -> B1 -> D, 此时D通过FLAG_ACTIVITY_CLEAR_TOP启动B,则栈顺序为A -> B2;对于其他启动模式,则栈顺序为 A-> B1(此时回调onNewIntent()..)。

 

三、Activity的其他属性

1、allowTaskReparenting:若某activity的该属性设置为“true”,则允许activity重新附属到与其具有相同affinity的task中。若某activity当前位于TaskA中(默认affinity不相同),则当TaskA回到后台并再次回到前台时,该activity已经不在TaskA中了;而如果启动与该activity具有相同affinity的TaskB,则该activity此时位于TaskB的栈顶。

2、alwaysRetainTaskState:默认情况下,当一个task处于后台很长时间后,系统会销毁该task中除了rootactivity之外的其他所有activity,因此当该task再次回到前台时,显示的是root activity。若task中的root activity的该属性设置为“true”,则系统不会这样做。

3、clearTaskOnLaunch:若task中的root activity的该属性设置为“true”,则当task处于后台时,即使时间很短,当task再次回到前台时,系统会销毁该task中除了root activity之外的其他所有activity,界面显示的是root activity。

4、finishOnTaskLaunch:若某activity的该属性设置为“true”,当task回到后台并再次回到前台时,该activity会从task中销毁。