Activity的启动模式(launchMode)

别人我不知道,反正对我来说,这种知识点就像xx生命周期,每次都看,但看完就忘。
今天就花点时间写下来,希望能记得长久一点。

目前常见的启动模式有四种:

1. standard
标准模式,是系统的默认模式,也是“最没有个性”的启动模式。每次启动一个activity都会重新创建一个新的实例,并且,“谁需要它,它就跟谁跑”。怎么讲?A是standard模式,B启动A,二话不说,A就会new一个实例跑到B所在的栈里。
2. singleTop
栈顶复用,一个“比较环保”的启动模式。假如现在栈内是ABCD,A在下,D在上,D启动模式是singleTop。如果再次启动D,D是不会重新创建的,所以,栈内情况仍会是ABCD。但是D的onNewIntent方法会被调用,通过参数可以得到当前请求的信息。
3. singleTask
栈内复用,一个“对周围环境很讲究”的启动模式。一个activity的“周围环境”是什么?栈呗!其实翻译成“栈内复用”不太利于理解,因为singleTask其实是这样的:对于一个activity来说,有符合要求的栈,我才复用;如果没有,那就新建一个符合要求的栈,然后我愿意才住进去。
举个栗子:
A在栈底,D是singleTask的

  • Stack1内有ABC。D要求栈是Stack2。要启动D,手头上没有Stack2,怎么办?新建一个Stack2,然后把D的实例放进去。
  • Stack1内有ABCD,并且,D要求栈也是Stack1。启动D,系统并不会重新创建D实例,但D的onNewIntent会被回调。如果最开始Stack1中并没有D,只有ABC,系统才会创建D的实例。
  • Stack1内有ADBC,D要求栈也是是Stack1。启动D,D的onNewIntent被回调,栈内变成AD。BC被clearTop了。

4. singleInstance
单实例模式,“不愿意跟别人合租”的模式。这是singleTask的加强版,除了具有singleTask所有的特性外,还加强了一点,具有此模式的activity只能单独地位于一个任务栈中。例如,Activity A是singleInstance的,A启动后,系统会为它单独新建一个任务栈,A会独自在这个新的任务栈中,后面的请求均不会创建新的A实例,除非这个栈被销毁。

既然已经到这了,不妨更进一步。


上面在聊singleTask的时候说到一个概念——“符合要求的栈”,到底什么样的栈才是“符合要求的栈”呢?这得从一个参数说起,taskAffinity,它指定了一个activity所需要的任务栈的名字,默认情况下activity所需任务栈的名字都是应用的包名。
taskAffinity主要有两大用处:

  • 配合singleTask,不解释。
  • 配合 allowTaskReparenting
    reparent,从字面上理解就是“重新指定父母”的意思。举个栗子:
    背景,Activity C,存在于应用B中,allowTaskReparenting为true,taskAffinity为默认值。
    现象,应用A启动应用B的Activity C,按home键退回桌面,再点击应用B图标,此时显示的并不会是B的MainActivity,而是显示Activity C。
    原因,开始,C的确在A的任务栈内,但A的任务栈并不是符合C要求的任务栈——taskAffinity是应用B包名的任务栈,C是“身在曹营心在汉”的。应用B一旦启动,系统发现符合C要求的任务栈已经创建,就做了一个reparent的操作——把C从A的栈转移到B的栈中。

你可能感兴趣的:(Activity的启动模式(launchMode))