标题有点长哈,本人文学功底太差,实在想不出更简洁的标题,就这么凑合了。
本文内容为activity的启动模式实验中发现的一个与预期不符的小问题,然后经过进一步实验得出的个人结论的记录。希望各位大神看过后能给出指导。
最初引发的问题:
有两个Activity:A, B。manifast中配置的第一个Activity为A,启动模式为singleTask。B的启动模式为默认(standard)。
流程为:A启动B,B再启动A,A再启动B,B再启动A。
结果为:A只创建一个,即只调用一次onCreate。B只创建一个,即只有第一次启动调用onCreate,第二次启动调用了onRestart。
日志:firstActivity对应A,SecondActivity对应B,以下日志相同。

那么问题来了,为什么B的启动模式为默认,但是却只调用了一次onCreate。此时我有一个怀疑点,因为B所在的任务栈中只有一个Activity,会不会是由于这个原因。
为了防止有些看官心急,在这里先把我的结论贴上来。欢迎大神指正。
结论:
如果有两个栈,栈A的ActivityA启动栈B的ActivityB,栈B中如果只有ActivityB,那么此时的ActivityB即使是默认启动模式也不会再新创建一个ActivityB,而是直接调起栈B中保存的ActivityB,生命周期调用onRestart。
如果有两个栈,栈A的ActivityA启动栈B的ActivityB,栈B中如果不只有ActivityB,此时ActivityB的启动模式如果是默认模式,系统会新创建一个ActivityB放入栈B,新的ActivityB会调用onCreate。
以下内容为得出结论的实验过程:
实验方式:
有三个Activity:main,A,B。manifast中配置的第一个Activity为main,启动模式为默认(standard)。A的启动模式为singleInstance,B的启动模式为默认。
流程为main启动A,A再启动B,B再启动A,A再启动B。差异点在main第一次启动A后是否调用finish。
实验结果:
1、调用finish。
此流程结果和之前的问题现象相同。
日志:

adb栈信息日志:(抹去部分为包名,不要在意那些细节)

通过adb信息能够看到,一共有两个栈,每个栈里只有一个Activity,说明第二次A启用B的时候系统并没有新建B,而是直接调起了栈内保存的B。
2、不调用finish。
日志:

adb栈信息日志:

通过adb信息能够看到,现有两个栈7908和7909,7908栈中有一个main和两个B,说明A在两次跳转B时,系统都是新生成的B放入栈中。
个人理解栈流程图
1、调用finish
首先main跳转A,由于A是singleInstance,所以新建栈。

然后此时main调用finish后,栈A清空

接下来ActivityA和ActivityB相互跳转,此时系统不会新建ActivityB

2、不调用finish
由于ActivityB不再是栈里唯一的Activity,所以在ActivityA再跳转ActivityB的时候,系统会新建ActivityB并入栈。

由于以上现象,我得出了我的结论,方便各位看官再次查看结论,我在这里再复制一下上面的结论。
结论:
如果有两个栈,栈A的ActivityA启动栈B的ActivityB,栈B中如果只有ActivityB,那么此时的ActivityB即使是默认启动模式也不会再新创建一个ActivityB,而是直接调起栈B中保存的ActivityB,生命周期调用onRestart。
如果有两个栈,栈A的ActivityA启动栈B的ActivityB,栈B中如果不只有ActivityB,此时ActivityB的启动模式如果是默认模式,系统会新创建一个ActivityB放入栈B,新的ActivityB会调用onCreate。
以上为本文全部内容,如果各位大神在观看中发现那些问题,请留言提示本人改正,欢迎大神们指导,谢谢各位观看。