activity四种启动模式(launchmodel)混合使用详解

       小编工作也有一段时间了,平时学东西挺多,但是总感觉学的东西忘得特别快,所以希望在学习的过程中可以把遇到的难题记录下来,一方面可以方便自己复习,另一方面帮助有同样问题的博友节省一些学习的时间,如果写的有什么不妥的地方,还请大家多多指正。

       本篇文章的写的是在使用activity的启动模式的时候,如果它们的启动模式不同,并且有多个activity一起使用,它们的任务栈怎么分配 ,新启动的activity对已有的activity产生怎样的影响,我们将详细说明。

activity四种启动模式,即standard,singleTop,singleTask,singleInstance,如果你对这四种启动模式还不太了解,推荐你去看一下这篇文章,写的很详细:

http://blog.csdn.net/liuhe688/article/details/6754323

接下来我们将讨论混合使用的情况,为了使思路清晰,我们集中以一个launch model为主的分开分析方法,这里需要用到一个adb命令(做开发不懂这个就过分了,度娘告诉你一切),adb shell dumpsys activity,这个命令可以帮我们查询现在正在运行的activity的详细情况,包括它所属的栈情况,一会我们也会用到这个命令。

1,首先从standard为主开始(以下A均为MainActivity):

a),如果两个activity(A和B)都是standard模式,并且都是以start activity的方式开启(即A里边用intent开启B,或者B里边用intent开启A),则会不断的在同一个栈中生成A和B的实例,按back键的时候则是按生成顺序的反向一个个退栈。

b),如果A是standard,B是single top,这个也比较好理解,类似上一个,区别是,当A或B在栈顶部的时候,在开启同一个activity,此时不会创建新的实例,而是复用已存在的顶部那个activity。

c),如果A和B是standard,在创建一个activity ,名字叫C,启动模式single task:A里启动C,然后C里启动B,此时它们还是再同一个栈里。因为C是single task,栈里只能有一个C的实例,如果再启动C的话,系统会把C上边的所有activity退栈,即销毁C上的所有activity,然后复用C。

d),这个比较复杂了,同样A和B是standard,C是single instance,A中开启C,此时C会开启一个新任务栈,假设A的任务栈是Task1,C的任务栈是Task2。此时若C再开启B的话,B会在Task1中创建自己的实例(利用adb命令获得的图1)看Runing activities下的内容,发现,A和B的栈id为73,C的栈id是74。再者,在B中再次开启C,虽然C是single instance,也不创建新的实例,而是复用Task2中已存在的C(图2),C没生成新的栈,栈id也未变。


规律:
启动一个新的activity 名为A:
情况一:A的启动模式不是single instance情况,并且栈里的activity的启动模式不是single instance,只要存在已有任务栈Task1,则A就会在已存在的任务栈Task1中启动,Task1的创建形式按acitivity的launchmodel特性来决定是否创建新的实例;
情况二:若A的启动模式是single instance,则在不存在A的情况下新建一个任务栈,并在此任务栈创建A的实例;
情况三: A的启动模式不是single instance,但是存在一个任务栈Task1,里边的activity是single instance启动模式,则新建一个任务栈Task2,并在此任务栈创建A的实例。

总结:
本来的计划是每个启动模式都作为一次主Activity讨论的,写完我发现有规律,于是自己测试了一下确实如此,于是把规律总结出来写在了上面,大家可以自行尝试,有什么不懂或者写的不妥的地方还请大家多多指正,博主qq:664871385.
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值