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

本文探讨了Android中Activity的standard和singleInstance启动模式,在这两种模式间进行跳转时的生命周期变化。作者邀请读者指出可能存在的问题,并欢迎经验丰富的开发者提供指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       标题有点长哈,本人文学功底太差,实在想不出更简洁的标题,就这么凑合了。
       本文内容为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。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值