Android只Activity四种启动模式

Activity启动方式有四种,分别是:

standard
singleTop
singleTask
singleInstance

可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题。

设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置android:launchMode属性

下面是这四种模式的作用:

standard

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

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

singleTop

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

例如:
若我有两个 Activity 名为 B1,B2, 两个 Activity 内容功能完全相同,都有两个按钮可以跳到 B1 或者 B2 ,唯一不同的是 B1 standard B2 singleTop
若我意图打开的顺序为 B1->B2->B2 ,则实际打开的顺序为 B1->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             C1->C2->C3->C2->C3->C1-C2
实际: C1->C2          C1->C2->C3          C1->C2                              C1->C2->C3->C1                               C1->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 了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值