你的位置:首页 > 操作系统

[操作系统]Android Activity launchMode研究


Android Activity launchMode研究

Activity的Launch mode一共有四种:
standard, singleTop, singleTask, singleInstance, 默认情况下是standard.
 

四种启动模式分为两组

Activity的这四种启动模式可以分为两组:
standard和singleTop是一组, 这两种模式标记的activity可以有多个实例(被初始化多次), 这些实例可以属于任何task, 并且可以被放在activity stack中的任何位置. 通常情况下,这两种模式标记的activity会被启动到调用startActivity()的那个task里, 除非Intent对象包含了FLAG_ACTIVITY_NEW_TASK这个标记, 则会启动一个新的task.
singleTask和singleInstance是另一组, 这两种模式的activity只能开始一个task, 它们永远在activity stack的根部, 而且设备在一个时间内只能持有一个activity的实例, 也即只有一个这样的task.
 

launchMode说明

standard

默认模式.
每次有一个新的Intent对象来启动standard activity时, 这个activity的一个新的实例就会被创建,来处理这个intent,也即每一个activity实例处理一个intent.

singleTop

与standard模式类似,一个新的singleTop的activity的实例也可能被创建,来处理一个新的intent.
但是,如果目标task中已经有一个这个singleTop的activity的实例,并且它是在栈顶,则这个已经存在的实例将接受这个新的intent( onNewIntent() 方法被调用), 新的实例不会被创建. 
其他的情况,比如,存在实例在目标task,但是不在栈顶;或者它在一个栈顶,却不在目标task,则新的实例都会被创建,并且放在栈顶, 这时候的行为和standard一样.

singleTask

singleTask和singleInstance唯一的区别就是, singleTask的activity允许其他activity在它的task中.
启动模式为singleTask的activity永远在它的task的根部, 同时, 其他的activities (launch mode为standard和singleTop) 可以被启动到这个task中.
 
系统在启动一个activity的时候,发现它的launchMode是singleTask, 并不能保证就会真的开启一个新的task, 还会检查activity的taskAffinity属性.
如果taskAffinity属性没有指定,默认是application的taskAffinity,名称即包名.
如果发现这个taskAffinity指定的task已经存在,则会在该task中新建一个activity; 如果该task不存在,才会新建一个task.
 
做了一个实验,用一个standard的activity来start一个singleTask的activity:
没有指定taskAffinity时, 它们的taskId相同, 说明它们还是在同一个task里;
为singleTask的activity指定一个新的taskAffinity后,singleTask的activity得到的taskId就和standard的不同了, 说明这时候开启了一个新的task.
 
在启动一个singleTask的activity实例时, 如果系统中已经存在这样一个实例, 将会把这个实例调度到task栈顶, 并清除它的task中栈上方的所有activities.
  

singleInstance

一个launch mode为singleInstance的activity, 不允许其他的activity在它的task中, 它自己是这个task中唯一的activity. 如果它启动另一个activity, 那个新的activity会被分配到一个不同的task中去, 就好像intent中含有FLAG_ACTIVITY_NEW_TASK Flag一样.
 
系统在启动一个activity的时候,如果发现它的launchMode是singleInstance,就会启动一个新的task,因为这种activity不会跟别人共用task. 所以和singleTask不同, singleInstance不需要特殊指定taskAffinity.
在singleInstance中启动的activity也不会跟它放在同一个task里, 根据要启动的activity的taskAffinity选择,可能在其他已有的task里,也可能开启新的task, 总之不是在singleInstance的task里.
 
昆明旅游团报价什么时候去昆明旅游最好去昆明旅游最佳路线昆明旅游景点推荐昆明跟团旅游报价多少香港东荟城怎么去? 广州丽思卡尔顿2015秋季婚礼秀落幕 八月是草原黄金季节 到草原旅游同大地裙摆共舞 鬼节来临 阴森的节日里哪里可以“见鬼” 米兰大教堂—世界建筑和文明史上的奇迹 叹息桥—面对人生的永恒叹息 中国好桥梁,细数中国十大名桥。 皮皮岛在哪 推荐:不可不尝的重庆武隆三大美食 重庆武隆:通往仙境的秘密入口 重庆武隆市美食全攻略之芙蓉江篇 游国内名校 袭一身书香:香港中文大学 深圳盐田到东莞塘厦莲湖如何坐车呢? 深圳东湖公园在哪个区? 在深圳五一如果下雨天有什么地方可去游玩的呢? 深圳碧岭生态村环境怎么样?好不好玩? STWH13009 Datasheet STWH13009 Datasheet STX13003G Datasheet STX13003G Datasheet STX13005G Datasheet STX13005G Datasheet 霍州市天气预报 霍州市天气预报 霍州市天气预报 老君山天气 老君山天气 老君山天气 天津塘沽区地图 天津塘沽区地图 天津塘沽区地图