11月更文挑战|Android基础-Activity启动模式

400 阅读3分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

Activity启动模式

在Android开发中Activity是以栈的形式进行管理。系统创建多个Activity时会将它们pop到任务栈中,根据栈的“先入后出”,在任务栈顶部就是当前前台Activity。但Android系统对于启动Activity有多种启动模式,这样的设计可以有更多灵活系统行为。

standard 默认模式

standard时Activity默认启动模式,每次启动的Activity都是一个单独实例,一个任务栈中可以有多个相同Activity实例并且它们都pop进同一个任务栈中。

例如下面的例子, 通过standard模式启动的Activity依次压入Task1中并且ActivityA可以创建多个实例:

flowchart LR
subgraph Task1
id1(ActivityA) --> ActivityB --> id2(ActivityA) --> ActivityC
end

singleTop 栈顶复用模式

singleTop模式下的Activity,如果当前该Activity已经位于任务栈顶,那么该Activity就不会再被创建,而是复用当前Activity,同时调用Activity中的onNewIntent方法获取到启动它Intent信息。

1.如下所示启动模式是singleTop的ActivityC在栈顶,当在启动ActivityC时就不会再创建新的ActivityC。

flowchart LR
subgraph Task1
ActivityA --> ActivityB --> ActivityC -->|onNewIntent| ActivityC
end

2.如下所示启动模式是singleTop的ActivityC不在栈顶,当在ActivityA后启动ActivityC时就会再创建新的ActivityC。

flowchart LR
subgraph Task1
id1(ActivityA) --> ActivityB --> id3(ActivityC) --> id2(ActivityA) --> ActivityC
end

PS: 该模式可以避免多次点击启动两个相同的Activity,适用于弹窗型Activity

singleTask 栈内复用模式

singleTask可以理解为具备singleTop功能的单任务栈单实例模式,在一个任务栈中只会存在这个一个Activity。

1.例如singleTask模式的ActivityD启动的任务栈不在Task1中就创建新的Task2入栈,并且在栈顶启动新ActivityD复用自己。

flowchart LR

subgraph Task2
ActivityD -->|onNewIntent| ActivityD
end

subgraph Task1
id1(ActivityA) --> ActivityB --> id3(ActivityC)
end

2.例如singleTask模式的ActivityD启动后不在栈顶,同时启动一个新singleTask模式的ActivityD,根据单任务栈单实例复用所以栈内的ActivityD会置顶。同时singleTask具有clearTop属性会将ActivityD上的Activity(ActivityC,ActivityF)出栈处理。最终Task1栈内就只剩下ActivityA,ActivityB,ActivityD

flowchart LR

subgraph Task1
id1(ActivityA) --> ActivityB --> ActivityD x--x C(ActivityC) x--x F("ActivityF") --> ActivityD
end

singleInstance 单一实例模式

singleInstance是singleTask的加强版单实例模式。singleInstance模式的Activity是Task中唯一仅有的成员。因此该模式下启动的Activity都拥有各自独立的Task。

intent标志

用于修改Activity的启动模式
  1. FLAG_ACTIVITY_NEW_TASK

    等同于singleTask

  2. FLAG_ACTIVITY_SINGLE_TOP

    等同于singleTop

  3. FLAG_ACTIVITY_CLEAR_TOP

    前提如果待启动Activity处于Task中,则销毁当前任务顶部所有Activity,通过onNewIntent传递给待恢复Activity,而非新建。

清理返回栈

  1. alwaysRetainTaskState

    Task根Activity实例设置为true,则在很长时间内Task中的Activity还会继续保留在堆栈中

  2. clearTaskOnLaunch

    与alwaysRetainTaskState恰好相反。Task根Activity实例设置为true,短时间内离开Task,回来之后Task只保留根Activity

  3. finishOnTaskLaunch

    类似于clearTaskOnLaunch,设置为true若用户离开然后返回Task,Task将不复存在

参考