Android基础之加载模式
讲道理博客本来我不太想扯太多理论知识。但是因为理论说明是最具理解意义的,这里就
。。。。。。。先介绍四大加载模式吧:
1.standard
2. singleTop
3.singleTask
4. singleInstance
设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置android:launchMode属性,例如:
standard: 默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
例如:若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……点back键会依照栈顺序依次退出。
可以看出在standard加载模式下每一次跳转实际上都是创建了新的实例,退出时也是一次销毁实例实例进行回退的。
singleTop:可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。onNewIntent是Activity生命周期里的一部分。
例如:若我有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。
若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)
若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。
这种情况下用例不会被重新创建。虽然相对比standard减少了实例的创建。但并不能保证栈内所有元素都是单例。
singleTask: (栈内单例)只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
例如:若我的应用程序中有三个Activity,C1,C2,C3,三个Activity可互相启动,其中C2为singleTask模式,那么,无论我在这个程序中如何点击启动,如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多个实例,但是C2只会存在一个,并且这三个Activity都在同一个task里面。
但是C1->C2->C3->C2->C3->C1-C2,这样的操作过程实际应该是如下这样的,因为singleTask会把task中在其之上的其它Activity destory掉。
操作:C1->C2 C1->C2->C3 C1->C2->C3->C2 C1->C2->C3->C2->C3->C1 C1->C2->C3->C2->C3->C1-C2
实际:C1->C2 C1->C2->C3 C1->C2 C1->C2->C3->C1 C1->C2
这种情况保证了被设置为singleTask的实例单例,但是不能保证全局单一,在其他task栈里面还是可能有实例的。有的时候我们需要全局单例,例如。主菜单,我们只需要一份便可。这个时候我们可以让主菜单的Activity独立在一个栈里面,全局单例。
singleInstance(全局单例):
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
例如:程序有三个ActivityD1,D2,D3,三个Activity可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的任务栈中。
当我们回退时,都是将栈内元素全部出栈为止才可以会完全退出。在存在全局单例的情况下都是先清空当前栈,在清空其他栈。
例如,有A,B,C 3个activity A是全局单例,如果当前进行A->B->C->A
回退是就会是A->destory C->destory B->destory 只要跳3次便可退出app,如果是A->B->C->A->C 那么回退就是
C->destory C->destory B->destory A->destory
实践检验了的,优快云传不了太多gif,没办法只能口述。。。。
水平有限,见谅。。。
:-》