zoukankan      html  css  js  c++  java
  • Activity的四种启动模式任务栈图解

    转载本专栏文章,请注明出处,尊重原创 。文章博客地址:道龙的博客

    今天带来另一篇Activity的文章——Activity的四种启动模式。该篇文章,会以图文讲解的方式带你彻底掌握Activity的启动方式和常见场景。该文章笔者先写于《知道了》平台,原文地址:点击打开链接


    一、启动模式介绍

         启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置;

      启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;

    讲解启动模式之前,有必要先讲解一下“任务栈”的概念;

      任务栈

      每个应用都有一个任务栈,是用来存放Activity的,功能类似于函数调用的栈,先后顺序代表了Activity的出现顺序;比如Activity1-->Activity2-->Activity3,则任务栈为:



    二、启动模式介绍

    (1)standard:

    每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;

    (2)singleTop:

    如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;

    (3)singleTask:

    如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;

    (4)singleInstance:

    如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;


    三、图解启动方式,彻底掌握启动模式

    standard
    默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

    例如:
    若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……
    点back键会依照栈顺序依次退出。

    这个很简单,就不需要用图例来说明了。


    singleTop
    可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法复用创建好的Activity,如果不在栈顶就会创建新的实例。

    例如:
    若我有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。
    若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了B2的onNewIntent方法)

    栈结构图解:


    若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。

    栈结构图解:


    singleTask
    只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
    如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。


    例如:
    若我的应用程序中有三个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-C2
    实际:C1->C2          C1->C2->C3           C1->C2                   C1->C2                                    

    后面两个方式有些绕,我们通过图解方式一一说明:

    (3)C1->C2->C3->C2

    (4)C1->C2->C3->C2->C3->C1-C2

    上边方式是C1->C2->C3->C2。我们在这个基础上继续分析,启动C1,会把C2销毁掉,继续启动C2,C2又前往栈顶。栈结构图解:


    若是别的应用程序打开C2,则会新启一个task。
    如别的应用Other中有一个activity,taskId为200,从它打开C2,则C2的taskIdI不会为200,例如C2的taskId为201,那么再从C2打开C1、C3,则C2、C3的taskId仍为201。
    注意:如果此时你点击home,然后再打开Other,发现这时显示的肯定会是Other应用中的内容,而不会是我们应用中的C1 C2 C3中的其中一个。

    栈结构图解:



    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启动的任务栈中。

    栈结构图解:


    若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3个task了。

    栈结构图解:


    相信Activity的四中启动模式,通过上述详细的概述以及栈结构图解的方式。您很快就能掌握里面的原理了。如果有疑惑的地方可以向我咨询。

    祝大家圣诞快乐!


    喜欢我的朋友可以关注我的博客专栏。


    也可以打开微信搜索公众号  Android程序员开发指南  或者手机扫描下方二维码 在公众号阅读更多Android文章。

    微信公众号图片:


  • 相关阅读:
    C语言堆栈入门——堆和栈的区别
    Unity时钟定时器插件——Vision Timer源码分析之一
    UNITY3D 2D物流流体插件下载|Liquid Physics 2D
    Unity3d插件Master Audio AAA Sound v3.5
    游戏行业的女性拥有强大的新盟友:Facebook
    Unity游戏设计与实现 南梦宫一线程序员的开发实例
    Unity4.6证书激活问题
    里诺全系列注册机+暗桩patch
    冰点还原8.53破解版
    NSE: known a priori estimate
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299464.html
Copyright © 2011-2022 走看看