Activity启动模式standard和singleInstance相互跳转生命周期

       标题有点长哈,本人文学功底太差,实在想不出更简洁的标题,就这么凑合了。
       本文内容为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,以下日志相同。
                         Activity启动模式standard和singleInstance相互跳转生命周期_第1张图片
                那么问题来了,为什么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。
                    此流程结果和之前的问题现象相同。
                    日志:
                             Activity启动模式standard和singleInstance相互跳转生命周期_第2张图片
                    adb栈信息日志:(抹去部分为包名,不要在意那些细节)
                             Activity启动模式standard和singleInstance相互跳转生命周期_第3张图片

                    通过adb信息能够看到,一共有两个栈,每个栈里只有一个Activity,说明第二次A启用B的时候系统并没有新建B,而是直接调起了栈内保存的B。
            2、不调用finish。
                    日志:
                             Activity启动模式standard和singleInstance相互跳转生命周期_第4张图片
                adb栈信息日志:
                             Activity启动模式standard和singleInstance相互跳转生命周期_第5张图片
               通过adb信息能够看到,现有两个栈7908和7909,7908栈中有一个main和两个B,说明A在两次跳转B时,系统都是新生成的B放入栈中。
            个人理解栈流程图
            1、调用finish
                首先main跳转A,由于A是singleInstance,所以新建栈。
                 Activity启动模式standard和singleInstance相互跳转生命周期_第6张图片
                然后此时main调用finish后,栈A清空
                 Activity启动模式standard和singleInstance相互跳转生命周期_第7张图片
                接下来ActivityA和ActivityB相互跳转,此时系统不会新建ActivityB
                 Activity启动模式standard和singleInstance相互跳转生命周期_第8张图片
            2、不调用finish
                由于ActivityB不再是栈里唯一的Activity,所以在ActivityA再跳转ActivityB的时候,系统会新建ActivityB并入栈。
                 Activity启动模式standard和singleInstance相互跳转生命周期_第9张图片
            由于以上现象,我得出了我的结论,方便各位看官再次查看结论,我在这里再复制一下上面的结论。
      结论:
             如果有两个栈,栈A的ActivityA启动栈B的ActivityB,栈B中如果只有ActivityB,那么此时的ActivityB即使是默认启动模式也不会再新创建一个ActivityB,而是直接调起栈B中保存的ActivityB,生命周期调用onRestart。
            如果有两个栈,栈A的ActivityA启动栈B的ActivityB,栈B中如果不只有ActivityB,此时ActivityB的启动模式如果是默认模式,系统会新创建一个ActivityB放入栈B,新的ActivityB会调用onCreate。

      以上为本文全部内容,如果各位大神在观看中发现那些问题,请留言提示本人改正,欢迎大神们指导,谢谢各位观看。

你可能感兴趣的:(Android基础学习)