从任务栈理解Activity启动模式

启动模式允许定义Activity的新实例与当前任务的关联方式。可以通过两种方式定义不同的启动模式:

  • 使用AndroidManifest.xml文件:在清单文件中声明activity时,可以指定activity在启动时应如何与任务关联。
  • 使用Intent的flags:当调用startActivity()时,可以在Intent中包含一个标志,该标志声明新activity应如何(或是否)与当前任务关联。

注意:清单文件可用的某些启动模式不可用作intent的标志,同样,某些启用模式可用作intent的标志,无法在清单中定义。

任务栈

android任务栈是一个具有后进先出特性的栈结构,用于存放activity。每次打开一个新的activity就会将该activity实例入栈,每次退出当前activity都会将对应的实例出栈。android系统通过任务栈有序地管理每个activity,并决定哪个activity与用户进行交互;只有任务栈栈顶的activity才可以跟用户进行交互。只有当任务栈中所有的activity都出栈时,任务栈才会被销毁。任务栈也可以移动到后台, 并且保留每一个activity的状态。可以有序的列出任务,同时也不会丢失activity的状态信息。 一个应用中可能不止一个任务栈,某些特殊情况下,单独一个actvity可以独享一个任务栈。还有一点就是一个任务栈中的actvity可以来自不同的应用程序,同一个应用的activity也可能不在一个任务栈中。

standard(标准模式)

默认的启动模式。每次启动该模式的activity时系统都会在启动它的任务中创建activity的新实例,并将intent路由到该实例。不论该实例是否存在。换言之,每次都会调用该模式的activity的onCreate,onStart和onResume。每个实例可以属于不同的任务,一个任务可以有多个实例。

singleTop(栈顶复用模式)

如果该模式的activity的实例已存在于当前任务的栈顶,则系统通过调用其onNewIntent()方法将intent发送到该实例,而不是创建activity的新实例。如果任务栈的栈顶不是该模式的activity的实例,则同标准模式一样,会重新创建新实例。每个实例可以属于不同的任务,一个任务可以有多个实例。

应用场景:当前的Activity中又要启动同类型的Activity。电商应用的商品详情页和新闻应用的正文页之类的频繁在栈顶打开或者每天都可能通过多个通知栏点击打开的activity。

注意:创建activity的新实例时,用户可以按“返回”按钮返回上一个activity。但是,当activity的现有实例处理新intent时,在新intent到达onNewIntent()之前,用户无法按“返回”按钮返回activity状态。

singleTask(栈内复用模式)

系统创建新任务并在新任务的根目录下实例化activity。但是,如果activity的实例已存在于单独的任务中,则系统会通过调用其onNewIntent()方法将intent发送到现有实例,而不是创建新实例。一次只能存在一个activity实例。

应用场景:适用于应用的首页。

注意:虽然activity在新任务中启动,但“后退”按钮仍会将用户返回到上一个activity。

singleInstance(全局单例模式)

与“singleTask”相同,但系统不会在持有实例的任务中启动任何其他activity。activity始终是其任务的唯一成员; 任何由此开始的activity都在一个单独的任务中打开。

应用场景:适用于支付和社会化这些需要在应用外启动的activity。

无论activity是在新任务中启动还是在与启动它的activity相同的任务中启动,“返回”按钮始终会将用户带到上一个activity。但是,如果启动指定singleTask启动模式的activity,则如果后台任务中存在该activity的实例,则将整个任务带到前台。此时,返回栈现在包括的前面任务中的所有栈顶activity。

Intent的flags

如果使用launchMode属性为activity指定的行为可以被启动activity的intent所包含的标记覆盖。

  • FLAG_ACTIVITY_NEW_TASK
    在新任务中启动activity。如果activity已在任务中启动,则该任务将返回到前台,并恢复其上一个状态,并且activity将在onNewIntent()中接收新的intent。这会产生与“singleTask”相同的行为。
  • FLAG_ACTIVITY_CLEAR_TOP
    如果正在启动的activity是当前activity(在后台堆栈的顶部),则现有实例将接收对onNewIntent()的调用,而不是创建activity的新实例。这会产生与“singleTop”相同的行为。
  • FLAG_ACTIVITY_SINGLE_TOP
    如果正在启动的activity已在当前任务中运行,则不会启动该activity的新实例,而是销毁其上的所有其他activity,并将此意图传递给activity的恢复实例(现在开启) top),通过onNewIntent())。生成此行为的launchMode属性没有任何值。
    FLAG_ACTIVITY_CLEAR_TOP通常与FLAG_ACTIVITY_NEW_TASK结合使用。当一起使用时,这些标志是一种在另一个任务中定位现有activity并将其置于可以响应intent的位置的方法。

注意:如果指定活动的启动模式是“标准”,它也会从堆栈中删除,并在其位置启动一个新实例来处理传入的意图。 这是因为当启动模式为“标准”时,总是为新意图创建新实例。

其他属性

  • taskAffinity
    任务相关性。标识着activity所属任务栈的名称,默认情况下,一个应用中所有activity所属的任务栈名称都为该应用的包名。一般跟singleTask模式或者跟allowTaskReparenting属性结合使用,在其他情况下没有实际意义。
  • allowTaskReparenting
    主要作用是activity的迁移,即从一个任务栈迁移到另一个任务栈,这个迁移跟activity的taskAffinity属性有关。当allowTaskReparenting的值为true时,则表示activity能从启动的任务栈移动到有着affinity的任务栈(当这个任务栈进入到前台时),当allowTaskReparenting的值为false,表示它必须放在启动时那个任务栈里。如果这个特性没有被设定,元素(当然也可以作用在每次activity元素上)上的allowTaskReparenting属性的值会应用到activity上。默认值为false。
  • clearTaskOnLaunch
    用来标记是否从任务栈清除根activity之外的所有activity,true表示清除,false(默认值)表示不清除。这个属性只对任务栈内的根activity起作用,任务栈内其他activity都会被忽略。如果android:clearTaskOnLaunch属性为true,每次重新进入这个应用时,只会看到根activity,任务栈中的其他activity都会被清除出栈。特别地,如果应用中引用到了其他应用的activity,这些activity设置了android:allowTaskReparenting属性为true,则它们会被重新宿主到有共同affinity的task中。
  • alwaysRetainTaskState
    如果当前activity的android:alwaysRetainTaskState设置为true时,那么该activity所在的任务栈将不会受到任何清理命令的影响,一直保持当前任务栈的状态。
  • finishOnTaskLaunch
    该属性与clearTaskOnLaunch有些类似,区别是finishOnTaskLaunch是作用在自己身上(把自己移除任务栈,不影响别的activity),而clearTaskOnLaunch则是作用在别人身上(把别的activity移出任务栈),如果把activity的android:finishOnTaskLaunch属性值设置为true时,离开这个activity所依赖的任务栈后,当重新返回时,该activity将会被finish掉,而且其他activity不会受到影响。

注意:singleTask模式的activity不能用startActivityForResult()方法启动,因为如果singleTask模式的activity设置了不同的taskAffinity,并且该taskAffinity对应的任务栈不是空的,那么当结束该singleTask模式的activity的时候,就会出现taskAffinity对应的任务栈的栈顶的activity而不是启动该singleTask模式的activity所对应的activity,为了防止发生这种情况,所以不允许这么做。

案例

<activity
    android:name=".A"
    android:launchMode="standard"/>

<activity
    android:name=".B"
    android:launchMode="singleTop" />

<activity
    android:name=".C"
    android:launchMode="singleTask" />

<activity
    android:name=".D"
    android:launchMode="singleInstance" />
启动顺序:A->B->C->D

堆栈情况:

Task id #51
    frontOfTask=true task=TaskRecord{9330159 #51 A=com.demo.launchmode U=0 StackId=1 sz=1}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.D
Task id #50
    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.C

    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A

Running activities (most recent first):
   TaskRecord{9330159 #51 A=com.demo.launchmode U=0 StackId=1 sz=1}
     Run #3: ActivityRecord{4ea3950 u0 com.demo.launchmode/.D t51}
   TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=3}
     Run #2: ActivityRecord{4f73b38 u0 com.demo.launchmode/.C t50}
     Run #1: ActivityRecord{5539c52 u0 com.demo.launchmode/.B t50}
     Run #0: ActivityRecord{7bf89b5 u0 com.demo.launchmode/.A t50}

    mResumedActivity: ActivityRecord{4ea3950 u0 com.demo.launchmode/.D t51}
    mLastPausedActivity: ActivityRecord{4f73b38 u0 com.demo.launchmode/.C t50}
启动顺序:A->B->C->D->A

堆栈情况:

Task id #50
    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=4}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A

    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=4}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.C

    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=4}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=4}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A
Task id #51
    frontOfTask=true task=TaskRecord{9330159 #51 A=com.demo.launchmode U=0 StackId=1 sz=1}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.D

    Running activities (most recent first):
      TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=4}
        Run #4: ActivityRecord{32bf12a u0 com.demo.launchmode/.A t50}
      TaskRecord{9330159 #51 A=com.demo.launchmode U=0 StackId=1 sz=1}
        Run #3: ActivityRecord{4ea3950 u0 com.demo.launchmode/.D t51}
      TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=4}
        Run #2: ActivityRecord{4f73b38 u0 com.demo.launchmode/.C t50}
        Run #1: ActivityRecord{5539c52 u0 com.demo.launchmode/.B t50}
        Run #0: ActivityRecord{7bf89b5 u0 com.demo.launchmode/.A t50}

    mResumedActivity: ActivityRecord{32bf12a u0 com.demo.launchmode/.A t50}
启动顺序:A->B->C->D->A->B

堆栈情况:

Task id #50
    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=5}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=5}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A

    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=5}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.C

    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=5}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=5}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A
Task id #51
    frontOfTask=true task=TaskRecord{9330159 #51 A=com.demo.launchmode U=0 StackId=1 sz=1}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.D

    Running activities (most recent first):
      TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=5}
        Run #5: ActivityRecord{dabcdce u0 com.demo.launchmode/.B t50}
        Run #4: ActivityRecord{32bf12a u0 com.demo.launchmode/.A t50}
      TaskRecord{9330159 #51 A=com.demo.launchmode U=0 StackId=1 sz=1}
        Run #3: ActivityRecord{4ea3950 u0 com.demo.launchmode/.D t51}
      TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=5}
        Run #2: ActivityRecord{4f73b38 u0 com.demo.launchmode/.C t50}
        Run #1: ActivityRecord{5539c52 u0 com.demo.launchmode/.B t50}
        Run #0: ActivityRecord{7bf89b5 u0 com.demo.launchmode/.A t50}

    mResumedActivity: ActivityRecord{dabcdce u0 com.demo.launchmode/.B t50}
    mLastPausedActivity: ActivityRecord{32bf12a u0 com.demo.launchmode/.A t50}
启动顺序:A->B->C->D->A->B->C

堆栈情况:

Task id #50
    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.C

    frontOfTask=false task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A
Task id #51
    frontOfTask=true task=TaskRecord{9330159 #51 A=com.demo.launchmode U=0 StackId=1 sz=1}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.D

    Running activities (most recent first):
      TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=3}
        Run #3: ActivityRecord{4f73b38 u0 com.demo.launchmode/.C t50}
      TaskRecord{9330159 #51 A=com.demo.launchmode U=0 StackId=1 sz=1}
        Run #2: ActivityRecord{4ea3950 u0 com.demo.launchmode/.D t51}
      TaskRecord{4e92dff #50 A=com.demo.launchmode U=0 StackId=1 sz=3}
        Run #1: ActivityRecord{5539c52 u0 com.demo.launchmode/.B t50}
        Run #0: ActivityRecord{7bf89b5 u0 com.demo.launchmode/.A t50}

    mResumedActivity: ActivityRecord{4f73b38 u0 com.demo.launchmode/.C t50}
启动顺序:A->B->C->D->A->B->C->D 同 A->B->C->D
启动顺序:A->B->B

堆栈情况:

Task id #51
    frontOfTask=false task=TaskRecord{da780ee #51 A=com.demo.launchmode U=0 StackId=1 sz=2}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{da780ee #51 A=com.demo.launchmode U=0 StackId=1 sz=2}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A

    Running activities (most recent first):
      TaskRecord{da780ee #51 A=com.demo.launchmode U=0 StackId=1 sz=2}
        Run #1: ActivityRecord{6b00a9 u0 com.demo.launchmode/.B t51}
        Run #0: ActivityRecord{dd8e300 u0 com.demo.launchmode/.A t51}

    mResumedActivity: ActivityRecord{6b00a9 u0 com.demo.launchmode/.B t51}



<activity
    android:name=".A"
    android:launchMode="standard"
    android:taskAffinity="com.demo.a"/>

<activity
    android:name=".B"
    android:launchMode="singleTop" />

<activity
    android:name=".C"
    android:launchMode="singleTask" />

<activity
    android:name=".D"
    android:launchMode="singleInstance" />
启动顺序:A->B->C->D

堆栈情况:

Task id #53
    frontOfTask=true task=TaskRecord{dcfbd5e #53 A=com.demo.launchmode U=0 StackId=1 sz=1}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.D
Task id #52
    frontOfTask=true task=TaskRecord{1da753f #52 A=com.demo.launchmode U=0 StackId=1 sz=1}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.C
Task id #51
    frontOfTask=false task=TaskRecord{822068f #51 A=com.demo.a U=0 StackId=1 sz=2}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{822068f #51 A=com.demo.a U=0 StackId=1 sz=2}
    taskAffinity=com.demo.a
    realActivity=com.demo.launchmode/.A

    Running activities (most recent first):
      TaskRecord{dcfbd5e #53 A=com.demo.launchmode U=0 StackId=1 sz=1}
        Run #3: ActivityRecord{a8bdb5f u0 com.demo.launchmode/.D t53}
      TaskRecord{1da753f #52 A=com.demo.launchmode U=0 StackId=1 sz=1}
        Run #2: ActivityRecord{6d7b17f u0 com.demo.launchmode/.C t52}
      TaskRecord{822068f #51 A=com.demo.a U=0 StackId=1 sz=2}
        Run #1: ActivityRecord{b5616a1 u0 com.demo.launchmode/.B t51}
        Run #0: ActivityRecord{d478987 u0 com.demo.launchmode/.A t51}

    mResumedActivity: ActivityRecord{a8bdb5f u0 com.demo.launchmode/.D t53}
    mLastPausedActivity: ActivityRecord{6d7b17f u0 com.demo.launchmode/.C t52}



<activity
    android:name=".A"
    android:launchMode="standard" />

<activity
    android:name=".B"
    android:launchMode="singleTop"
    android:taskAffinity="com.demo.b"/>

<activity
    android:name=".C"
    android:launchMode="singleTask" />

<activity
    android:name=".D"
    android:launchMode="singleInstance" />
启动顺序:A->B->C->D

堆栈情况:

Task id #55
    frontOfTask=true task=TaskRecord{b1ebd24 #55 A=com.demo.launchmode U=0 StackId=1 sz=1}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.D
Task id #54
    frontOfTask=false task=TaskRecord{a075242 #54 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.C

    frontOfTask=false task=TaskRecord{a075242 #54 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.b
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{a075242 #54 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A

    Running activities (most recent first):
      TaskRecord{b1ebd24 #55 A=com.demo.launchmode U=0 StackId=1 sz=1}
        Run #3: ActivityRecord{53ba32e u0 com.demo.launchmode/.D t55}
      TaskRecord{a075242 #54 A=com.demo.launchmode U=0 StackId=1 sz=3}
        Run #2: ActivityRecord{341bd7 u0 com.demo.launchmode/.C t54}
        Run #1: ActivityRecord{6ab4800 u0 com.demo.launchmode/.B t54}
        Run #0: ActivityRecord{ba60d7a u0 com.demo.launchmode/.A t54}

    mResumedActivity: ActivityRecord{53ba32e u0 com.demo.launchmode/.D t55}
    mLastPausedActivity: ActivityRecord{341bd7 u0 com.demo.launchmode/.C t54}



<activity
    android:name=".A"
    android:launchMode="standard"/>

<activity
    android:name=".B"
    android:launchMode="singleTop" />

<activity
    android:name=".C"
    android:launchMode="singleTask"
    android:taskAffinity="com.demo.c"/>

<activity
    android:name=".D"
    android:launchMode="singleInstance" />
启动顺序:A->B->C->D

堆栈情况:

Task id #58
    frontOfTask=true task=TaskRecord{82bb7f1 #58 A=com.demo.launchmode U=0 StackId=1 sz=1}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.D
Task id #57
    frontOfTask=true task=TaskRecord{2f38257 #57 A=com.demo.c U=0 StackId=1 sz=1}
    taskAffinity=com.demo.c
    realActivity=com.demo.launchmode/.C
Task id #56
    frontOfTask=false task=TaskRecord{9af3144 #56 A=com.demo.launchmode U=0 StackId=1 sz=2}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{9af3144 #56 A=com.demo.launchmode U=0 StackId=1 sz=2}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A

    Running activities (most recent first):
      TaskRecord{82bb7f1 #58 A=com.demo.launchmode U=0 StackId=1 sz=1}
        Run #3: ActivityRecord{dd6b750 u0 com.demo.launchmode/.D t58}
      TaskRecord{2f38257 #57 A=com.demo.c U=0 StackId=1 sz=1}
        Run #2: ActivityRecord{50337ab u0 com.demo.launchmode/.C t57}
      TaskRecord{9af3144 #56 A=com.demo.launchmode U=0 StackId=1 sz=2}
        Run #1: ActivityRecord{350806d u0 com.demo.launchmode/.B t56}
        Run #0: ActivityRecord{fae2fbc u0 com.demo.launchmode/.A t56}

    mResumedActivity: ActivityRecord{dd6b750 u0 com.demo.launchmode/.D t58}
    mLastPausedActivity: ActivityRecord{50337ab u0 com.demo.launchmode/.C t57}



<activity
    android:name=".A"
    android:launchMode="standard"/>

<activity
    android:name=".B"
    android:launchMode="singleTop" />

<activity
    android:name=".C"
    android:launchMode="singleTask" />

<activity
    android:name=".D"
    android:launchMode="singleInstance"
    android:taskAffinity="com.demo.d"/>
启动顺序:A->B->C->D

堆栈情况:

Task id #59
    frontOfTask=true task=TaskRecord{e124bdf #59 A=com.demo.d U=0 StackId=1 sz=1}
    taskAffinity=com.demo.d
    realActivity=com.demo.launchmode/.D
Task id #58
    frontOfTask=false task=TaskRecord{c1f5af5 #58 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.C

    frontOfTask=false task=TaskRecord{c1f5af5 #58 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{c1f5af5 #58 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A

    Running activities (most recent first):
      TaskRecord{e124bdf #59 A=com.demo.d U=0 StackId=1 sz=1}
        Run #3: ActivityRecord{179cf67 u0 com.demo.launchmode/.D t59}
      TaskRecord{c1f5af5 #58 A=com.demo.launchmode U=0 StackId=1 sz=3}
        Run #2: ActivityRecord{ff93e7c u0 com.demo.launchmode/.C t58}
        Run #1: ActivityRecord{127c497 u0 com.demo.launchmode/.B t58}
        Run #0: ActivityRecord{7c10e5 u0 com.demo.launchmode/.A t58}

    mResumedActivity: ActivityRecord{179cf67 u0 com.demo.launchmode/.D t59}
    mLastPausedActivity: ActivityRecord{ff93e7c u0 com.demo.launchmode/.C t58}



<activity
    android:name=".A"
    android:launchMode="standard"/>

<activity
    android:name=".B"
    android:launchMode="singleTop" />

<activity
    android:name=".C"
    android:launchMode="singleTask" />

<activity
    android:name=".D"
    android:launchMode="singleInstance"
    android:taskAffinity="com.demo.launchmode"/>
启动顺序:A->B->C->D

堆栈情况:

Task id #60
    frontOfTask=true task=TaskRecord{aecf302 #60 A=com.demo.launchmode U=0 StackId=1 sz=1}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.D
Task id #59
    frontOfTask=false task=TaskRecord{47ef650 #59 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.C

    frontOfTask=false task=TaskRecord{47ef650 #59 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.B

    frontOfTask=true task=TaskRecord{47ef650 #59 A=com.demo.launchmode U=0 StackId=1 sz=3}
    taskAffinity=com.demo.launchmode
    realActivity=com.demo.launchmode/.A

    Running activities (most recent first):
      TaskRecord{aecf302 #60 A=com.demo.launchmode U=0 StackId=1 sz=1}
        Run #3: ActivityRecord{f726b47 u0 com.demo.launchmode/.D t60}
      TaskRecord{47ef650 #59 A=com.demo.launchmode U=0 StackId=1 sz=3}
        Run #2: ActivityRecord{f301bd6 u0 com.demo.launchmode/.C t59}
        Run #1: ActivityRecord{bb9b87f u0 com.demo.launchmode/.B t59}
        Run #0: ActivityRecord{7f123eb u0 com.demo.launchmode/.A t59}

    mResumedActivity: ActivityRecord{f726b47 u0 com.demo.launchmode/.D t60}
    mLastPausedActivity: ActivityRecord{f301bd6 u0 com.demo.launchmode/.C t59}

查看堆栈指令: adb shell dumpsys activity activities
查看顶层活动信息: adb shell dumpsys activity top
查看当前活动: adb shell dumpsys window | findstr mCurrentFocus或者adb shell dumpsys window | findstr mCurrentFocus
查看顶层活动: adb shell dumpsys activity top | find “ACTIVITY”

感谢大家的支持,如有错误请指正,如需转载请标明原文出处!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值