最近在学习《Android开发艺术探索》,所以对所学习到的知识做个总结,就算是做笔记吧。
Activity的启动模式目前有四种,分别是standard、singleTop、singleTask和singleInstance。
怎么给Activity的启动模式呢?
一般我们通过AndroidMenifest.xml文件配置,如下所示:
<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar" />
也可以通过在Inent中设置标志来为Activity指定启动模式,如下所示:
Intent mIntent = new Intent(getApplicationContext(), FirstActivity.class);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(mIntent);
如果两种模式都存在,以第二种方式为准。
那么四种启动模式具体是具有怎样的功能呢?
- **standard:**标准模式,也是默认模式。每次启动一个Activity都会重新创建一个实例,不管这个实例是否存在。这是一种典型的多实例实现,一个任务栈可以有多个实例,每个实例也可以属于不同的任务栈。比如:在Activity A中启动了Activity B,那么B就会进入到A所在的任务栈中,在Activity B中又启动Activity A ,那么A又会进入任务栈中(Activity A和Activity B都是standard模式)。如图:
我们来看一下在standard模式下Activity创建的生命周期,图中三个Activity启动模式都是standard模式。
从上图我们可以看出:standard模式下启动的Activity可以一直被创建,并进入任务栈中;要注意的是当我们启动新的Activity时,旧的Activity要先执行onPause方法,然后新的Activity才会创建,当新的Activity完全可见时,旧的Activity才会执行onStop方法。 - singleTop:栈顶复用模式。在这模式下,如果Activity已经位于任务栈的栈顶,那么该Activity将不会被重新创建。比如,目前任务栈内有Activity A,在Activity A中启动Activity B,任务栈中会有A、B。如果再启动B,任务栈中任是A、B。其中B的启动模式为singleTop,如图:
图中A的启动模式可以是standard也可以是singleTop。
如下图,图中三个Activity启动模式都是singleTop模式:
上图可知:如果Activity已经位于栈顶,那么此Activity就不会被创建。需要注意的是此时你启动栈顶Activity时,这个Activity的onCreate和onStart方法不会被系统调用,因为它们并没有发生改变。但是它的onNewIntent方法会被调用,通过此方法的参数我们可以去取当前请求的信息. - **singleTask:**栈内复用模式。在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例。
- 如果当前任务栈S1有ABCD四个Activity,这个时候B以singleTask模式请求启动,那么任务栈会将B以上的Activity实例全部出栈,此时S1任务栈中的情况为AB。
- 如果目前任务栈S1有ABC三个Activity,这个时候D以singleTask模式请求启动,其所需要的任务栈为S2,由于S2和D的实例都不存在,所以系统会先创建任务栈S2,然后再创建D的实例并将其入栈到S2。
- 如果目前任务栈S1有ABC三个Activity,这个时候D以singleTask模式请求启动,其所需要的任务栈为S1。由于S1已经存在,系统会直接创建D的实例并将其入栈到S1。
- 和singleTop一样,系统也会调用其onNewIntent
如图:
下图中我们将Activity B设置为singleTask模式,其余的使用standard模式:
上图中,启动APP时FirstActivity进栈,再启动SecondActivity,SecondActivity进栈。再启动ThirdActivity,ThirdActivity进栈。再次启动SecondActivity时,SecondActivity之前的Activity全部出栈,这里也就是ThirdActivity出栈了,所以我们按返回键时,直接回到了FirstActivity。
4. singleInstance:单实例模式。这是一直加强的singleTask模式,它除了具有singleTask模式的所以特性以外,还加强了一点,那就是具有这种模式的Activity只能单独地位于一个任务栈中。
如图(B为singleInstance模式):
如下图,我们将SecondActivity设置为singleInstance模式,其余的使用standard模式:
启动APP时FirstActivity进栈,接着启动SecondActivity,最后启动ThirdActivity。当我们按下返回键时,我们发现我们直接从ThirdActivity返回到了FirstActivity,再按返回时才跳转到SecondActivity。这就说明SecondActivity与(FirstActivity和ThirdActivity)存在于不同的栈中。