Activity启动模式探索

Activity使我们在开发中最常用到的组件,除了坑爹的生命周期他的启动模式也是很重要的一个知识点。
Activity 一共有四种启动模式,分别为:standard,singleTop,singleTask,singleInstance。一下分别讨论着四种启动模式的异同和使用场景。

standard

standard是系统默认的启动模式,他的特点是每次启动Activity都会创建一个新的Activity实例。每个新的Activity既可以存在于同一个任务栈也可以存在于不同的任务栈下(任务栈接下来会浅谈),谁启动了这个standard模式的Activity,这个Activity就是出现在谁的栈内(singleInstance下令做讨论)。如果用ABCD的代表四个Activity的话我们启动了顺序A-B-C这个时候又启动了B那么栈内就会有ABCB四个Activity实例。ABCD在下文中代表四个Activity

singleTop

该模式下分类讨论,
①该Activity已经存在:
a.该Activity已经位于栈顶:这个Activity就不会被重新创建,并且会调用onNewIntent方法。举例说明,我们启动了ABCD四个Acitivity,这个时候D位于栈顶,并且D是singleTop模式,这个时候在D内重新启动D任务栈内结构仍为ABCD,但是这个时候D的onCreate,onStart不会被调用,onNewIntent被系统调起,我们可以再onNewIntent里面处理相关的信息。
b.该Activity不在栈顶:直接举例说明,C为singleTop模式,其他的为standar模式,栈内存在ABDC,C在栈顶,这个时候再去启动D就会重新创建一个新的Activity,栈内存在ABDCD五个Activity。
②该Activity不存在
会创建一个新的位于栈顶的Activity,其他同上。

singleTask

一个App不一定是只有一个任务栈干到死的,可能存在多个任务栈,而在singleTask模式的Activity只会存在一个栈内,分类讨论如下:
①该Activity在所在的栈都不存在:
创建一个新的栈然后将新Activity压入栈内。
②该Activity所在的任务栈存在:
a.栈在Activity不存在:创建新的Activity并压入栈内。
b.栈在Activity也存在:
1.该Activity在栈顶:Activity唤起并调用onNewIntent。
2.该Acitivity不在栈顶:该Activity被调至栈顶并调用onNewIntent。
注意:栈的结构是先进后出的,所谓的调至栈顶就是清空该Activity上面的Activity使用其暴露在顶部。(好黑暗/(ㄒoㄒ)/~~)
(上面提到的Acitivity所在的栈会在讨论完这四种模式后讨论)

好吧,显然这个singleTask模式是为处女座准备的。

举个栗子:栈S1存在ABC ,在C内启动singleTask模式的D,D所在的栈应该为S2,好了,开始套公式(敲黑板),
如果S2不存在,创建S2,并在S2内创建新的D;
如果S2存在,里面已经有了EF就是没有D,那么创建D,并压入S2栈顶;
如果S2存在,里面有了DEF,猥琐的D蹲在正好栈底部,那么D上面的EF就会被赶出S2栈,使D出现在栈顶,并调用D的onNewIntent方法。

综上所述:singleTask是一个任务栈内复用的模式。

PS:启动一个新的任务栈的singleTaskActivity系统动画会和standard模式下一键跳转不一样。不知道是不是系统的问题,还是Android对于任务栈就是这么定义的。

singleInstance

顾名思义,单例模式...
这种模式下和上述的singleTask很接近,唯一不一样的是,在singleTask模式下的Activity是允许大家住一间屋的,但是它有事的时候你们都得让路,它是不会重建的。而这个singleInstance模式的Activity简直就是混蛋的孤家寡人,它不允许它住的屋子里面有人...也就是说singleInstance自己拥有一个任务栈,栈内只有他自己。

我们上面提到在standard之下跳转,在哪个栈内跳转就standard模式的Activity就会出现的谁的栈内,但是基于上面singleInstance的孤家寡人理论这两个显然是矛盾的,本着知行合一,做一个实现,新建ABC三个Activity,C为singleTask,A->B->C 然后继续跳转到A,这个是时候back,会发现显示了B,并没有显示C,接着back会显示A,再BACK显示C,在C就退出应用了。而且在C相邻Activity会明显发现动画不一样。

这是我们看到的情况,接下来我们用 abd shell dumpsys activity命令,找到输出

TaskRecord{85124cb #1461 A=com.maomibox.myapplication U=0 StackId=1 sz=3}
        Run #16: ActivityRecord{7733e23 u0 com.maomibox.myapplication/.A t1461}
TaskRecord{e348f76 #1462 A=com.maomibox.myapplication U=0 StackId=1 sz=1}
        Run #15: ActivityRecord{6c5074a u0 com.maomibox.myapplication/.C t1462}
TaskRecord{85124cb #1461 A=com.maomibox.myapplication U=0 StackId=1 sz=3}
        Run #14: ActivityRecord{8047354 u0 com.maomibox.myapplication/.B t1461}
        Run #13: ActivityRecord{9e18691 u0 com.maomibox.myapplication/.A t1461}

会发现id为85124cb只有ABAAcitivity,C存在于 id为e348f76 的栈内,也就是说C所在的栈内是有他自己,A也并没有像上文说的standard一样出现在C所在的栈内。在栈85124cb全部退出后,执行e348f76 栈的退出,最终退出应用。

啥是任务栈

上面提到了那么多任务栈,这个任务栈是啥?
栈是一种先进后出的结构,任务栈就是存放Activity的地方,standard模式下只有一个任务栈,而在singleTask模式下并搭配上taskAffinity属性则会新开一个任务栈,singleInstance自带Buff,自己会创建一个任务栈,如果在singleTask下不指定taskAffinity那么就相当于啥都没做,还是在默认栈内。给activity指定任务栈如下

        <activity android:name=".C"
            android:launchMode="singleInstance" 
            android:taskAffinity="com.demo.c"/>

上文提到的“所在的栈”就是这个com.demo.c,C就运行在这个栈内。
taskAffinity属性和signleTask启动模式或者和allowTaskReparenting搭配才有用没其他情况下毛用没有(有待验证)。

Activity FLAGS

Activity的Flag很多,Intent.FLAG_ACTIVITY_ IDE会联想出来很多,列举几个常用的如下:
FLAG_ACTIVITY_NEW_TASK
同singleTask
FLAG_ACTIVITY_SINGLE_TOP
同singleTop
FLAG_ACTIVITY_CLEAR_TOP
该FLAG下同FLAG_ACTIVITY_NEW_TASK搭配下和之前将的清光栈暴露Acitivity类似。

使用场景(本段来自互联网)自己体会吧...

standard: 适合多个实例存在的情况,比如,发邮件页面。
singleTop: 适合接收通知内容显示页面。例如,某些应用会为用户推送一些消息通知,当用户从任务栏中进入查看消息内容界面时,如果设置为singleTop时,这样每次行为都使用同一个实例,用户点击返回时不会存在多个消息页面的情况。
singleTask: 适合使用在一个程序的主界面。
singleInstance: 使用较少,比如一些launchAPP可能会使用到。

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

推荐阅读更多精彩内容