您的位置:首页 > 其它

深入学习Activity之启动模式

2016-06-19 14:09 399 查看

1.activity的启动模式

默认的启动模式,每次都需要创建新的实例,有些需求默认启动模式不能满足要求,所以需要不同的启动模式。

四种启动模式

1.standard,默认模式

每次启动都会创建新的activity实例不管是否存在或者是否在栈顶,A 启动了B activity,那么B就会进入A所在的任务栈中,如果使用全局的ApplicationContext去启动activity就会出错,因为没有指定启动activity的任务栈,需要添加Flag_activity_new_task 标记。

2.singleTop 栈顶复用模式

如果被启动的activity已经处于任务栈的栈顶那么就不会创建该activity,也不会执行activity的生命周期,二回调用onNewIntent()方法,可以通过该方法,获得启动的intent

3.singleTask 栈内复用模式,比较复杂的模式

被启动的activity A如果为singletask模式,那么启动它时,

系统会找是否有栈是 ==A需要的栈==,如果有这样的栈那么查找A是否在栈中,

如果在栈中和singletop类似,调用其onNewIntent(),同时将其移到栈顶

如果有栈但不存在A的实例,则创建实例A


如果没有这样的栈,则创建栈和activity实例,压入栈中。

4.singleInstance,加强版的singleTask

被启动的activity,系统会为其创建新的task栈,后续的启动都不会创建新的activity了。singletask是查找是否有activity 需要的栈,复用栈,没有在创建栈。

A需要的栈,taskAffinity参数

TaskAffinity参数标识了activity需要的栈的名字,默认情况是包名 ,也可以在即指定,该惨数只有和singleTask和allowTaskReparenting属性一起使用才有意义。

和singletask一起使用,如上面描述的一样,和taskAddinity名字相同的就是activity需要的栈,

和allowTaskReparenting一起使用,A应用启动B应用的C activity,C具有该属性时,启动C后,C会从A的任务栈移到B的任务栈,点击B应用的图标后启动的是Cactivity而不是主activity;因为A的activity的Affinity和B的Affinity不一样所以会移动。

任务栈分前台和后台,跟栈内的activity相关

如何指定启动模式

方法一:

activity的注册信息中添加属性,launchmode

方法二:

intent.addFlags(Intent.Flag_Acitivy_new_task)

区别:第二种优先级高,同时存在是以第二种为准。

限定范围有区别,第一种为U发直接设定,Flag_activity_clear_top标识,第二种无法指定singleinstance

ps:

adb shell dumpsys activity 可以查看任务栈信息

activity的flags

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_CLEAR_TOP:启动时,栈中所有位于他上面的activity都出栈,一般和new——task一起使用,如果不是singletask,那么连同自己也出栈,创建新的实例。singletask默认具有该标志

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:

excludeFromRecents 不会出现在里氏activity中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: