Android 启动模式简析

Android之中有四种启动模式,分别是standard,singletop,singleTask,singleInstance.在说这四种启动模式之前,得先知道任务栈和回退栈两个概念:任务栈,顾名思义,用来存放Activity,按照先后顺序入栈,一个应用可以有多个任务栈,任务栈有TaskId,在Activity之中,可以通过Log.i("", "-->getTaskId " + getTaskId());来打印TaskId,taskId可以算是唯一区别任务栈的属性;回退栈,我的理解是不断按返回键Activity的退出顺序,就这么简单理解一下。

再说启动模式,standard,普通的启动模式, <activity
            android:name=".SingleTaskActivity"
            android:label="@string/title_activity_single_task"
            android:launchMode="standard" >
        </activity>,如果初始化一个Activity的时候设置为standard,那么以后每次启动该Activity的时候都会创建该Activity的实例,并放入一个任务栈之中(可以理解为当一个应用程序启动之时,在启动MainActivity的时候开启了一个任务栈),例如ActivityA,不断的启动,那么任务栈会是ActivityA<-ActivityA<-ActivityA<-ActivityA<-;如果有四个standard的Activity A,B,C,D,按照A,B,C,D的先后顺序启动,那么任务栈之中存入顺序就是A<-B<-C<-D,此时按回退键,退出顺序是D C B A;

        singleTop,栈顶单一启动模式,就是说当某一个Activity位于栈顶的时候,而且它的启动模式是singleTop的时候<activity
            android:name=".SingleTaskActivity"
            android:label="@string/title_activity_single_task"
            android:launchMode="singleTop" >

这种情况下,再次启动它本身,不会再次创建此Activity的实例,而是用之前的那个位于栈顶的Activity实例,也就是说这个Activity不会在走onCreate方法;例如有standard模式的Activity a b c e,和singleTop的Activity d,按照a b c d d的启动顺序,任务栈之中只有a、b、c、d四给实例,且只有这样一个任务栈,因为当启动a、b、c、d四个activity之后,d所属的Activity已经位于栈顶,当再次启动d的时候,不会创建该Activity的实例,而是冲用它,也不会走它的onCrea等方法,当不断按回退键的时候,退出顺序应该是d c b a;同样是上述activ,但是启动顺序是a b c d e d d e,任务栈之中是a b c d e d e,在启动 a b c d e的时候,按顺序入栈,在启动 d d e的时候,启动d 发现栈顶没有d的实例,那么创建d的实例并入任务栈,又一次启动d,发现栈顶有d的实例,重用该实例,则不存在入栈之说,最后启动e,创建e的实例并入任务栈;

      SingleTask,栈中单一的启动模式,在某一个应用程序的任务栈之中它是唯一,一次创建之后,下次启动的时候重用之前的实例,也就是说不会重走onCreate方法,在这里要记住它会走这个方法onNewIntent,并且让该实例位于栈顶,那么位于该实例之上的其他Activity的实例使其出栈,也就是finnish掉;例如按照 a b c d e f g d的顺序启动,其中d的启动模式是singleTask<activity
            android:name=".SingleTaskActivity"
            android:label="@string/title_activity_single_task"
            android:launchMode="singleTask" >
        </activity>

其他的都是standard,在启动 a b c d e f g 之后,任务栈之中的实例为 a b c d e f g ,再次启动d之后,因为该任务栈之中已经有了d的实例,那么不需要创建d的实例,因为要让d位于栈顶,也就是当前页面展示的是d,这样任务栈之中位于d的实例之前实例e f g 将会出栈,此时任务栈之中只有a b c d ,按回退键,退出顺序是 a b c d;

前面三个会发现都是在同一个任务栈之中进行出栈入栈的操作,taskid都是一样的,最后一个singleInstance,

    singleInstance,单一的启动模式,启动一个应用程序,mainActivity所在有一个任务栈 taska,此时启动singleInstance的Activity a <activity
            android:name=".SingleInstanceActivity"
            android:label="@string/title_activity_single_instance"
            android:launchMode="singleInstance" >
        </activity>

会重新创建一个任务栈taskb,并把a入栈,可见taska和taskb是两个不同任务栈;假设有程序A和程序B,程序A启动后有一个taska,再启动singleInstance Activity c后会有一个taskc,程序B启动后会有一个taskb,再启动 c,那么不会创建新的task即任务栈,这就是singleInstance的作用,只要启动过一次,以后不论在哪个程序之中启动这个Activity都不会再次创建实例,也不会创建新的任务栈,而是重用之前;例如:在程序A中,启动 a b c,c是singleInstance,在c中启动 d e f g,即 a b c d e f g,那么会有两个任务栈

a b d e f g 和 c,因为当前页面展示的是g,所以回退的顺序是g f e d b a,最后回退 c



 


你可能感兴趣的:(android,栈,启动模式)