Android四种启动模式及相关intent flag解析

在android应用开发中,打造良好的用户体验是很重要的。而在用户体验中,界面的引导和跳转是值得深入研究的内容。在开发中,与界面跳转联系比较紧密的概念是“Task”和“Back Stack”回退栈。Activity的启动模式和Intent类中定义的一些标志会影响task和back stack的状态,进而影响用户体验。

一、基础概念

task

task是一个“First In Last Out”的栈,task中可以有一个或者多个Activity。task可以看作是管理Activity的单元,系统中可能存在一个或者多个task,每个task里面有一个或者多个Activity。对于一个Activity,可能只容许有一个实例或者可以有多个实例,这些实例可能位于多个Task,也可能位于一个task中。

Activity如何处理它的实例,以及它在task中的分布情况,这些可以通过launchMode/相关Flags来进行控制。

taskAffinity

Activity的一个属性,值为string,用于描述Activity之间的亲密关系

如果Activities拥有同样的taskAffinity,则它们是亲密的,它们之间在相互跳转时会位于同一个Task中,并不会产生新的task。反之情况比较复杂。

默认情况下,每个Activity都采用和Application相同的taskAffinity,如果Application没有设置的话,则默认使用包名。

二、启动模式

包括四种启动模式:standardsingleTopsingleTasksingleInstance

standard

默认模式。在该模式下,Activity可拥有多个实例,并且每次启动新添加一个实例,并且这些实例既可以位于同一个task,也可以位于不同的task(依据启动它的Activity模式和当前task)。

singleTop

singleTop模式下,在同一个task中,如果存在Activity的实例并且该实例位于栈顶,则调用startActivity()时不再重新创建一个实例,而是调用该Activity的onNewIntent方法。

singleTask

总结:只容许有一个包含该Activity实例的task存在

singleTask官方介绍中有三个特点:

1.如果是第一次创建该Activity实例,则新建task并将该Activity添加到该task中。
2.如果已经存在该Activity实例,则打开已有的Activity实例,并且调用Activity的onNewIntent()方法,并不会创建新的Activity实例。
3.在任一时刻,最多只有一个该Activity实例存在

在实际测试中,发现singleTask的表现与taskAffinity属性设置相关。

在taskAffinity属性相同时,第一次创建Activity实例时,并不会启动新的task,而是直接添加到原有task。非第一次启动,将Activity所在task中Activity之上的全部Activity删除,然后跳转到该Activity中。

在taskAffinity属性不相同时,第一次创建Activity实例时,会启动新的task,并将实例添加到新创建的task中。非第一次启动,将Activity所在task中Activity之上的全部Activity删除,然后跳转到该Activity中。

singleInstance

总结:只容许存在唯一的Activity实例

singleInstance官方介绍中有两个特点:

1.如果是第一次创建该activity实例,则新建task并将该Activity添加到task中,并且该task中只能容纳该Activity这一个实例,不会再添加其他Activity实例
2.如果该Activity实例已经存在于某个task中,则直接跳转到该task。

singleTask和singleInstance有相同之处,也有不同之处。

相同之处:任意时刻,最多只容许存在一个实例。

不同之处:

1.singleTask受android:taskAffinity属性的影响,singleInstance不受android:taskAffinity的影响。

2.singleTask模式下,实例所在栈中容许有其他Activity实例,singleInstance模式下,实例所在栈不容许有其他实例存在。

3.当跳转到Activity实例时,singleTask会删除task中位于实例之上的所有Activity,singleInstance中不需要删除。

三、Intent与启动模式相关Flag

包括四个相关flag,FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_CLEAR_TASK,FLAG_ACTIVITY_CLEAR_TOP,FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_SINGLE_TOP

作用和singleTop一样,调用startActivity时,如果同一个task中已经存在了Activity的实例并且改实例位于栈顶,则不创建新的Activity实例,直接调用Activity的onNewIntent方法。否则创建一个新的Activity实例并压入栈中。

FLAG_ACTIVITY_NEW_TASK

官方说明上和singleTask具有相同的效果,但是在实际使用过程中并不是如此,一般和FLAG_ACTIVITY_CLEAR_TASK/FLAG_ACTIVITY_CLEAR_TOP搭配使用。

在taskAffinity相同时,FLAG_ACTIVITY_NEW_TASK并不起作用,表现和standerd相同。

在taskAffinity不相同时,第一次启动Activity时会创建一个新的task,并将该实例添加到task中,非第一次启动Activity,则不会发生任何事。

FLAG_ACTIVITY_CLEAR_TOP

当taskAffinity相同时:添加FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOP没有任何作用。和没有添加时的效果一样。
当taskAffinity不同时:添加FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOP后,表现的和singleTask一样。

FLAG_ACTIVITY_CLEAR_TASK

当taskAffinity相同时:添加FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK没有任何作用。和没有添加时的效果一样。

当taskAffinity不同时:添加FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK后,启动Activity,如果Activity已有实例存在,则情况该task并创建一个Activity实例压入改task中。否则,直接启动新的task并将B添加到新建的task中。

四、启动模式的其它属性

包括:

  • android:taskAffinity
  • allowTaskReparenting
  • alwaysRetainTaskState
  • clearTaskOnLaunch
  • finishOnTaskLaunch

仅做了解

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

推荐阅读更多精彩内容