Android 知识点

Activity的启动模式

2018-12-21  本文已影响0人  怡红快绿

我们都知道,在默认情况下,当我们启动多个Activity的时候,这些Activity会被依次加入到任务栈中,当我们点击系统返回键,Activity又会按照后进先出的顺序依次出栈。
但是,如果我们多次启动同一个Activity,系统会重复创建多个实例,这样看起来是不是有点奇怪呢?系统设计者当然要考虑这个问题,因此启动模式应运而生。

目前Activity的启动模式有四种:standard、singleTop、singleTask和singleInstance。

假设现在任务栈中内情况是ABCD,D位于栈顶,A位于栈底。这个时候要启动D,假如D的启动模式是singleTop,那么栈内情况依然是ABCD;假如D的启动模式是standard模式,那么栈内情况变成ABCDD。

现有任务栈S1,栈内有实例ABC,C为栈顶,A为栈底,此时D以singleTask模式要求启动。
1、假设D所需栈为S2,由于系统内没有S2栈,所以会先创建S2任务栈,然后新建D实例并且压入S2栈中。
D启动完成后:S1-ABC,S2-D。
2、假设D所需任务栈为S1,由于S1已经存在并且栈内没有D的实例,因此系统会创建D实例并且压入S1栈中。
D启动完成后:S1-ABCD。
3、假设D所需任务栈为S1,并且此时S1内情况为ADBC,由于S1内已经有D的实例存在,所以系统直接将D调到栈顶,并且依次出栈C、B。这是因为singleTask模式默认具有clearTop的效果。
D启动完成前:S1-ADBC。
D启动完成后:S1-AD。

假设Activity A的启动模式为singleInstance,当A启动后,系统会为它创建一个新的任务栈,并把A压入新的栈中。由于栈内复用的特性,后续的请求都不会创建新的Activity。


在singleTask模式中,多次提到Activity所需任务栈,那么如何指定一个Activity所需任务栈?这要从一个参数说起:TaskAffinity(任务相关性),这个参数对应的值就是Activity所需任务栈名字,Activity默认所需的任务栈名字就是应用包名。任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity处于暂停状态,用户可以将后台任务栈切换到前台。

比如有两个应用A和B,A启动了B的Activity C,然后按Home键回到桌面,单击应用B的桌面图标,这个时候不会启动应用B的主Activity,而是直接显示被应用A启动的Activity C。也就是说C从A的任务栈转移到了B的任务栈中。

有两种方法可以为Activity指定启动模式,第一种是通过AndroidManifest.xml为Activity指定启动模式:

<activity
            android:name=".components.activity.LoginActivity"
            android:configChanges="orientation|keyboardHidden|navigation|screenSize"
            android:launchMode="singleTask"
            android:windowSoftInputMode="stateHidden|adjustPan" />

第二种是通过在Intent中设置标志位来为Activity指定启动模式:

Intent intent = new Intent(A.this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(intent);

这两种方式有一定的区别,在优先级上,第二种方式要高于第一种,如果同时存在,以第二种为准;两种方式在限定范围上也有所不同,第一种方式无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法为Activity指定singleInstance启动模式。

Activity的一些常用标志位

上一篇 下一篇

猜你喜欢

热点阅读