独家理解 Android 四大组建之一Activity四种加载模式
前言:
在阅读此篇前,如果想深入了解Activity 可以阅读:点击打开链接
launchMode在Activity之间跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。
(但是随着fragment的出现,Activity也不会用的比之前那么频繁。)
Activity一共有以下四种launchMode:
1.standard 标准模式,默认加载模式
2.singleTop Task顶单例模式
3.singleTask Task内单例模式
4.singleInstance 全局单单例模式
这东西怎么来的:
有用他就来了。在Android中,Activity都是用栈来管理。而且可以管理多个Activity,当我们启动应用时 就会自动生成一个栈来 启动当前的activity。对于栈 也没有提供什么方法进行操作。但在在Activity 可以调用getTaskId() 用来获取当前栈的ID,也可以给我们去测试当前的使用栈的情况。
四种模式:
先来看一张图。
粗略的看下这张图,大概有个印象。
(系统默认模式)
singleTop模式:
每次通过这种模式启动Activity时,Android总会为启动的Activity创建一个新的实例,并将该Activity添加到当前Task栈 中,这种模式不会创建新的Task,只是将新Activity添加到原有的Task 中,可以理解成一直叠加吧
(注:总会创建一个新的实例,这种模式不会去新建另一个栈)
从图中就可以看出没打开就是创建一个实例,按back返回时也是B->A->B->A
singleTop模式
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该 Activity实例,只要不在栈顶,都会创建实例。
(注:不再栈顶都会重新创建实例)
B->A 目前A处于栈顶,A->AA已经处于栈顶,则重用。
singleTask模式
如果启动的目标Activity不存在Task栈中,系统将会创建一个目标Activity实例,并将它加入到Task栈顶
如果启动的目标Activity已存在Task栈顶,此时模式和singleTop模式相同
如果启动的目标Activity已存在但没有位于Task栈顶,系统将会把该目标Activity上面的所有Activity移除Task栈,使该 Activity置于Task栈顶
(不讲道理模式:如果已经存在,他将会把前面的都 卡擦(销毁)掉,然后自己再跑到栈顶去)
很不讲道理,A从地下跑上去都把中间的XX掉了。(这种模式 可以应用于 支付的情况 比如说支付完毕是直接跳到主页 中间的点击 付款 确认付款 是不需要返回的)
singleInstance模式
这种加载模式下,无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来装载该Activity 例。
如果创建的目标Activity不存在,系统先会创建一个全新的Task,接着创建一个Activity实例,然后将该目标Activity加入到新的Task栈顶
如果创建的目标Activity已经存在,无论在哪个Task栈中,系统将会把Activity所在的栈置于前台。
(注:这种模式Activity总是位于Task栈顶)
从途中可以看出前面一个栈中没有 B 则会单独创建一个栈 来存放B的实例。
(重点:当钱是两个栈 可以用gettaskid() 这个方法来测试 当钱的栈情况。 假设前面一个栈的ID为5 后面一个ID为6
当推出去的时候 都要把ID为5的栈里面的Activity销毁了之后才开始 到ID为6的栈 )
测试方法:
推荐动手实践去理解这些模式。 可以根据getTaskId() 这个方法 获取栈的ID 再添加栈后 打印出日志 添加完后 按 back键再打印日志
测试以下,对吼进行总结。相信你就会完全明白Activity的四种加载模式。
上面即为Android中的四种启动模式,我们在开发Android项目时会经常使用到和巧妙设置Activity的启动模式会节省系统开销和程序运行效 率。
(r如果有错,望大神们指出)