您的位置:首页 > 移动开发 > Android开发

Android笔记系列--Activity四种启动模式,常用Flag和标签

2018-01-29 08:44 351 查看
源码:

https://github.com/StarsAaron/ActivityLaunchModelDemo/tree/master

task

启动一个新应用,系统就会为之创建一个task(因为不同应用的affinity是不一样的,默认是包名),来放置根Activity;

默认情况下,一个Activity启动另一个Activity时,两个Activity是放置在同一个task中的,后者被压入前者所在的task栈,当用户按下后退键,后者从task被弹出,前者又显示在幕前,特别是启动其他应用中的Activity时,两个Activity对用户来说就好像是属于同一个应用;

系统task和task之间是互相独立的,当我们运行一个应用时,按下Home键回到主屏,启动另一个应用,这个过程中,之前的task被转移到后台,新的task被转移到前台,其根Activity也会显示到幕前,过了一会之后,在此按下Home键回到主屏,再选择之前的应用,之前的task会被转移到前台,系统仍然保留着task内的所有Activity实例,而那个新的task会被转移到后台,如果这时用户再做后退等动作,就是针对该task内部进行操作了。

affinity

拥有相同affinity的多个Activity理论同属于一个task。

默认情况下,一个应用内的所有Activity都具有相同的affinity,默认的affinity是中的包名,我们可以为设置taskAffinity属性值,这样可以应用到下的所有,也可以单独为某个Activity设置taskAffinity。

Activity 四种启动模式

1. standard-默认模式

每次启动一个Activity都会重写创建一个新的实例

2. singleTop-栈顶复用模式

如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用。

注意:standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你指定了taskAffinity属性。


3. singleTask-栈内复用模式

如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法。

4. singleInstance-全局唯一模式

以singleInstance模式启动的Activity在整个系统中是单例的

Intent几种常见的flags

1. FLAG_ACTIVITY_NEW_TASK

目标Activity运行在自己的task中。表示使用一个新的Task来启动一个Activity。

2. FLAG_ACTIVITY_CLEAR_TOP

假设目标Activity为B,如果B是standard模式,task中存在B的实例,则清空B实例上面的Activity(包含B自己),并创建一个新B实例添加到task顶。

如果B不是standard模式,task中存在B的实例,则清空B实例上面的Activity把B实例显示在task顶。

与在清单文件指定android:launchMode=”singleTask”效果相同。

3. FLAG_ACTIVITY_SINGLE_TOP

当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。

与在清单文件指定android:launchMode=”singleTop”效果相同。

4. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

被废弃,使用FLAG_ACTIVITY_NEW_DOCUMENT 代替。

退居后台之后再次在桌面点击应用,使用该标记的Activity不会显示,但还在Task中。如果在任务历史中点击该应用还是会显示有标记的Activity。

对于一个处于后台的应用,如果在主选单点击应用,这个动作中含有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,长按Home键,然后点击最近记录,这个动作不含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记

5. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

- 启动Activity时创建新的task来放置Activity实例;

- 已存在的task被放置于前台。系统会根据affinity对指定的task进行重置操作,task会压入某些Activity实例或移除某些Activity实例。

6. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

具有此标记位的Activity不会出如今历史Activity的列表中

7.FLAG_ACTIVITY_NO_HISTORY

当该Activity启动其他Activity后,该Activity就被销毁了,不会保留在任务栈中。如A-B,B中以这种模式启动C,C再启动D,则任务栈只有ABD。

<activity>
的task相关属性


1. android:allowTaskReparenting

B使用standard模式,B被A应用(affinity不一样)调用B的Activity进入A的task中,当在A退居后台,B被调用的Activity会回到B的task中,启动B显示的是被调用的Activity,打开A应用显示的是根Activity。

2. android:alwaysRetainTaskState

用来标记应用的task是否保持原来的状态,此属性只对task的根Activity起作用

3. android:clearTaskOnLaunch

用来标记是否从task清除除根Activity之外的所有的Activity,也只对根Activity起作用。如果设置了这个属性为“true”,每次用户重新启动这个应用时,都只会看到根Activity,task中的其他Activity都会被清除出栈。

4. android:finishOnTaskLaunch

这个属性和android:allowReparenting属性相似,不同之处在于allowReparenting属性是重新宿主到有共同affinity的task中,而finishOnTaskLaunch属性是销毁实例。即被其他应用调用过后退居后台再次进入直接销毁。如果这个属性和android:allowReparenting都设定为“true”,则这个属性胜出。

5. android:excludeFromRecents=”true”

具有此标记位的Activity不会出如今历史Activity的列表中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息