Android的四种启动模式及Task简述

Android四种Activity启动模式:

在AndroidManifest.xml 的Activity中配置属性,属性name为android:launchMode.四种模式分别为standard(默认)、singleTop、singleTask、singleInstance

standard

最简单的启动模式,每次启动Activity都会在当前的task栈中新建一个实例并放到栈顶。

注:这种模式下,即使发起startActivity的那个Activity和即将要启动的Activity是同一个Activity,也会新建对应的实例,返回时按栈的顺序从顶至底返回

singleTop

特性:如果当前栈顶的activity和即将启动的activity是同一个activity,则不会重新启动activity,而是通过onNewIntent的方式传递数据

注:在接收到onNewIntent更新了Activity数据之后,此时按返回,会退出此Activity,而不是返回到接收onNewIntent之前那个状态

应用场景:只希望栈顶保留一个相同的实例的情况

singleTask

系统会创建一个新的task,并将此activity实例化到这个新task作为它的根activity;如果在当前在某个任务中已经有一个已存在的activity实例,则不会创建新的实例,而是调用这个activity的onNewIntent()方法(并把该任务调到前台),同一时间只会有一个activity的实例存在

"注:"虽然activity在新的task中启动,按返回键还是能回到原来的activity中

1. 系统只会尝试创建一个新的task,而不是创建一个新的task(与FLAG_ACTIVITY_NEW_TASK原理一致)
2. 如果有一个已经存在的实例,系统会将这个task中此实例之上的所有activity弹出栈,无论该实例在哪个任务栈中
3. activity在新的task中启动后,如果这个task中还有其他activity,按返回键将会按照这个task里的栈的顺序依次返回
4. 启动这种启动类型的activity时,startActivityForResult()会失效(不会收到正确的结果)

"如果有一个已经存在的实例,系统会将这个task中此实例之上的所有activity弹出栈"

QQ截图20190621215228.png

"activity在新的task中启动后,如果这个task中还有其他activity,按返回键将会按照这个task里的栈的顺序依次返回"

2.png
  • 根本原因:android在跳转时,对singleTask启动模式的activity添加了一个flag: FLAG_ACTIVITY_NEW_TASK

  • singleTask总结:

    1. 如果当前已存在的任务栈中,没有需要跳转的这个activity的实例存在,则创建此activity,创建的activity位于哪个任务栈,由activity的taskAffinity决定。
    2. 如果当前有一个任务栈中,存在此activity的实例,则将此任务栈带到前台,并且将此activity之上的activity全部弹出栈,该activity不用重新创建,通过onNewIntent()接收参数
    3. 由于以上特性,对于launchMode为singleTask的activity来说,同一时间,只会有一个实例存在
    4. 应用场景:launcher 或者类似于具有launcher属性的activity
singleInstance
  1. 和singleTask很相似,但比singleTask特殊
  2. 对于具有singleInstance的activity,一定是独占一个任务栈,即:别的activity启动具有singleInstance的activity时,如果不存在该实例,则一定会新建一个任务栈,将activity实例作为根activity;如果已经有启动的实例,则直接将该实例带到前台,通过onNewIntent传参具有singleInstance的activity启动别的activity时,一定会将即将启动的这个activity挤出栈,让它自己去寻找一个适合的栈,如果没有适合的栈,则新建一个
  3. 应用场景:与应用分离开的activity,比如呼叫来电界面
Task affinity

Activity倾向于依赖的Task,所属的拥有相同affinity的多个Activity理论同属于一个task,task自身的affinity决定于根Activity的affinity值。

  1. 根据affinity重新为Activity选择宿主task(与allowTaskReparenting属性配合工作;
  2. 启动一个Activity过程中Intent使用了FLAG_ACTIVITY_NEW_TASK标记,根据affinity查找或创建一个新的具有对应affinity的task。

默认情况下,一个应用内的所有Activity都具有相同的affinity,都是从Application(参考<application>的taskAffinity属性)继承而来,而Application默认的affinity是<manifest>中的包名,我们可以为<application>设置taskAffinity属性值,这样可以应用到<application>下的所有<activity>,也可以单独为某个Activity设置taskAffinity

Android Task 相关的Intent flag
  • FLAG_ACTIVITY_NEW_TASK

    当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task。

    如果同一个应用中Activity的taskAffinity都使用默认值或都设置相同值时,应用内的Activity之间的跳转使用这个标记是没有意义的,因为当前应用task就是目标Activity最好的宿主

    特性:如果你试图启动的activity,已经有一个task为此activity启动过了,它不会重新启动一个activity,而是将这个task带到前台。如果想屏蔽这个特性,需要同时使用FLAG_ACTIVITY_MULTIPLE_TASK标签

  • FLAG_ACTIVITY_NEW_TASK

3.png
  • FLAG_ACTIVITY_CLEAR_TOP

    类似于启动模式中的singleTask,带有此flag的activity在启动时,会寻找任务栈中是否有实例存在,如果有,则将其之上的activity全部弹出栈。

    "区别在于:"

    1. FLAG_ACTIVITY_CLEAR_TOP不像singleTask,系统不会为其添加FLAG_ACTIVITY_NEW_TASK属性,也就是说,如果不手动添加NEW_TASK属性,只能在当前任务栈中查找是否有实例,如果手动添加,则会在taskAffinity指定的任务栈中查找
    2. singleTask查找到实例后会继续使用该实例,通过onNewIntent传参,而在以下情况下, FLAG_ACTIVITY_CLEAR_TOP会销毁重建activity:launchMode为standard,且没有FLAG_ACTIVITY_SINGLE_TOP标记
  • FLAG_ACTIVITY_SINGLE_TOP与launchMode中的singleTop作用相同

  • FLAG_ACTIVITY_CLEAR_TASK
    这个标记必须和FLAG_ACTIVITY_NEW_TASK一起使用用于清空跳转后的Activity所属的Task,使得跳转后,该activity一定是这个task的跟activity。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容