Activity四种启动模式详解

最近在学习《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);

如果两种模式都存在,以第二种方式为准。

那么四种启动模式具体是具有怎样的功能呢?

  1. **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方法。
  2. 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方法会被调用,通过此方法的参数我们可以去取当前请求的信息.
  3. **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模式):
B为singleInstance
如下图,我们将SecondActivity设置为singleInstance模式,其余的使用standard模式:
这里写图片描述

启动APP时FirstActivity进栈,接着启动SecondActivity,最后启动ThirdActivity。当我们按下返回键时,我们发现我们直接从ThirdActivity返回到了FirstActivity,再按返回时才跳转到SecondActivity。这就说明SecondActivity与(FirstActivity和ThirdActivity)存在于不同的栈中。

发布了27 篇原创文章 · 获赞 187 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/Mr_wzc/article/details/51746444