Activity的启动模式

1. 启动模式的四种类型

(1) standard

标准模式,也是系统的默认模式,每次启动一个Activity都会重新创建一个Activity的实例。不管这个实例是否存在。一个栈中有多个实例,每个实例也可能属于多个任务栈。谁启动了这个Activity,那么该Activity就存在启动了他的那个Activity的任务栈中。比如Activity A启动了Activity B ,那么Activity B就在Activity A的栈中。而当使用ApplicationContext去启动一个activity的时候会报错,原因就在于ApplicationContext没有自己的任务栈,需要添加一个ACTIVITGY_NEW_TASK的flag,来新建一个任务栈,等同于一个Broadcastreceiver启动一个Activity一样,需要添加这个属性。

(2) singleTop

栈顶模式,设置此模式的Activit不会呗重建,他的onNewIntent方法会被回调。通过此方法的参数可以去除当前请求的信息,如果Activity不是位于栈顶,则activity会被城建。

(3) singleTask

栈内复用模式,也可以叫单实例模式,只要Activity存在,系统就不会重建,并且也会回调onNewIntent方法。吧Activity放到任务栈里边的栈顶位置,如果不存在,则创建并且吧Activity放入栈中。举几个例子:
① 任务栈S1中存在ABC三个activity,这时候Activity D以singleTask的模式强求启动,他需要的任务栈是S2,由于S2和D的实例都不存在,则系统会创建S2,然后重建D,吧D放入S2中。
② 另外一种情况,假设D所需要的任务栈是S1,其他情况如上,由于S1已经存在,所以系统会创建D并且吧D方法S1中。
③ 如果实例D在S1中,并且当前任务栈的情况是ADBC,则D不会重建,而是切换到栈顶,并且调用onNewIntent方法,由于singleTask默认具有clearTop的效果,则D上边所有的Activity会被清除,只剩下AD。

(4) singleInstance

单实例模式,比singleTask多了一点,Activity一直都是放在一个单独的栈里边。
———————————————我是分割线——————————————

2. singleTask模式

(1) 现在有两个单独的任务栈,前台任务栈AB,后台任务栈CD,CD的模式是singleTask,如果现在请求D启动,则系统会吧整个的任务栈切换到前台,为ABCD;(2) 如果请求C启动,因为涉及到了Taskaffimty和singleTask一起使用的问题,所以放在最后讲解。
———————————————我又出现了——————————————

3. singleTask另外一种情况

这里先了解下什么是任务栈,便于以后的方便说明。

(1) 任务栈

这要要从一个参数说起,Taskaffimty,可以理解为相关性,这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有的Activity所需的任务栈的名字为应用的包名,当然,我们可以为每个Activity都单独指定Taskaffimty属性,这个属性值必须不能和包名相同,否则相当于没有制定。Taskaffimty主要和singleTask启动模式或者AllowTaskReparening属性配对使用。在其他情况下没有意义。

(2) Taskaffimty和singleTask一起使用,待启动的Activity会运行在名字和Taskaffimty形同的任务栈中。

(3) 当Taskaffimty和AllowTaskReparening结核的时候,这个情况比较复杂,当应用A启动了应用B之后,如果启动的这个Activity的AllowTaskReparening的属性为true,那么应用B被启动之后,此Activity会直接从应用A的任务栈移动到应用B的任务栈中。



比如有两个应用A和B,A启动B的一个Activity C,然后按Home健回到桌面,打开应用B,打开的界面不是应用B的起始界面,而是Activity C,也可以说C从A的任务栈移动到了B的任务战。可以这么理解,A启动了C,这个时候C只能运行在A的任务栈中,但是C属于B,正常情况下,C的Taskaffimty值肯定和A的不同,所以B被启动后,B会创建自己的任务栈,这个时候系统发现C原本需要的任务栈已经被创建过了,所以吧C从A的任务栈中移动过来了。
—————————————————吼 吼————————————————

4. singleTask继续研究

上边说的了一种情况:现在有两个单独的任务栈,前台任务栈AB,后台任务栈CD,CD的模式是singleTask,如果现在请求D启动,则系统会吧整个的任务栈切换到前台,为ABCD;如果请求C启动,现在我们来利用singleTask, Taskaffimty和singleTask一起使用的知识来分析下这种情况。



Activity A使用默认模式(standard),Activity B和Activity C设置启动模式singleTask,并且设置Taskaffimty为com.text.demo(项目包名),现在我们从A跳转到B,然后再从B跳转到C,再从C跳转到A,再从A跳转到B,然后按back键两次,出现的结果是什么

—————————————吼 吼 最后一次出现了——————————————

答案是:回到桌面

分析:此时存在两个任务栈,第一次启动的任务栈,我们命名为S1,此时栈内只有一个Activity A为后台任务栈,另外一个前台任务栈为Activity B、C和D,为什么呢?我们来分析下,第一次启动A,因为A是默认模式,所以系统新建一个实例,然后A跳转到B,B因为设置了singleTask,所以系统会检测B的任务栈是否存在,不存在创建一个新的任务栈,命名为S2,检测B的实例,不存在,创建一个新的实例,然后跳转到B的界面,然后倒转到C呢,因为B和C都设置了Taskaffimty,所以B和C属于同一个栈,所以系统只会创建一个C的实例,然后跳转到C,然后跳转到A呢,因为A的模式是默认模式,每次跳转都会创建一个新的实例,所以现在S2现在的顺序是BCA,然后再跳转到B呢,因为B的任务栈存在,实例也存在,直接跳转,但是上边讲过一条,不知道大家有没有注意,就是singleTask默认具有clearTop效果,所以跳转到B的顺序是CAB,然后清除掉B上边的Activity,现在S2只剩下了B,而S1还存在一个A,所以按两次back键直接会返回到桌面。

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

推荐阅读更多精彩内容