Android基础之加载模式(实践检验真理)

来源:互联网 发布:java 文件上传 编辑:程序博客网 时间:2024/04/27 17:19

                                                                              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


实践检验了的,CSDN传不了太多gif,没办法只能口述。。。。

水平有限,见谅。。。


















:-》

0 0
原创粉丝点击