1、与任务相关的属性
- taskAffinity :修改任何给定Activity的关联
- 系统使用包名标识应用的默认任务关联;
- taskAffinity属性取字符串值,必须不同于包名;
- taskAffinify起作用的两种情况
- 启动Activity的Intent包含FLAG_ACTIVITY_NEW_TASK;
- Activity的allowTaskReparenting为true;
- 启动Activity的Intent包含FLAG_ACTIVITY_NEW_TASK;
- 系统使用包名标识应用的默认任务关联;
- lauchMode
- standard,默认模式 —— 系统在启动Activity的任务中创建Activity的新实例并向其传送Intent。Activity可以多次实例化,每个实例可以属于不同任务,一个任务可以拥有多个实例。
- singleTop —— 若当前任务的顶部已经存在Activity的一个实例,则系统会通过onNewIntent()方法传送Intent。Activity可以多次实例化,每个实例均可属于不同的任务,一个任务可以拥有多个实例(前提是位于返回栈顶的Activity并不是Activity的现有实例)。
- singleTask —— 系统创建新任务并实例化位于新任务底部的Activity。如果该Activity的一个实例已经存在一个单独任务中,系统会通过现有实例的onNewIntent()方法向其传送Intent。一次只能存在Activity的一个实例。
- singleInstance —— 与singleTask相同,只是系统不会将任何其他Acitivty启动到包含实例的任务中。该Activity是其任务唯一仅有的成员;由此Activity启动的任何Activity均在单独任务打开。
- 使用launchMode属性为Activity指定的行为可以由Intent附带的Activity启动标志替代。
- standard,默认模式 —— 系统在启动Activity的任务中创建Activity的新实例并向其传送Intent。Activity可以多次实例化,每个实例可以属于不同任务,一个任务可以拥有多个实例。
- allowTaskReparenting —— true/false,Activity是否可以从其启动的任务移动到与其具有关联的任务。
- clearTaskOnLaunch —— true/false,若设置为true,每当用户离开任务后返回时,系统都会将堆栈清除到只剩下根Activity。与alwaysRetainTaskState刚好相反。
- alwaysRetainTaskState —— true/false,用户长时间离开任务后,仍将所有Activity保留在其堆栈中(默认会清除根Activity外的其他Activity)。
- finishOnTaskLaunch —— true/false,类似clearTaskOnLaunch,但只对单个Activity起作用。可能导致任何Activity停止,包括根Activity。用户离开后返回任务,任务将不复存在。
2、与任务相关的Intent标志 (启动模式)
- FLAG_ACTIVITY_NEW_TASK —— 在新任务中启动Activity。如果正在启动的Activity已经处于运行状态,则该任务会转到前台并恢复其最后状态,同时Activity会在onNewIntent()中收到新Intent。
- 在Activity上下文之外启动Activity需要给Intent设置FLAG_ACTIVITY_NEW_TASK标志,否则会报异常。
- 首先会查找是否存在和被启动Activity具有相同亲和性的任务栈,如果有,则直接把这个栈整体移动到前台,并保持栈中状态不变。
- 默认情况下同一个应用中的所有Activity拥有相同的taskAffinity
- 在Activity上下文之外启动Activity需要给Intent设置FLAG_ACTIVITY_NEW_TASK标志,否则会报异常。
- FLAG_ACTIVITY_SINGLE_TOP—— 如果正在启动的Activity是当前Activity(位于返回战顶部),则现有实例会接收对onNewIntent()的调用,而不是创建新实例。产生与singleTop相同的行为。
- FLAG_ACTIVITY_CLEAR_TOP —— 如果正在启动的Activity已在当前任务中运行,则会销毁当前任务顶部所有Activity,并通过onNewIntent()将此Intent传递给Activity已恢复的实例。
- FLAG_ACTIVITY_CLEAR_TOP通常与FLAG_ACTIVITY_NEW_TASK结合使用。
3、处理关联(即Activity优先属于哪个任务)
(1)默认情况下,同一应用中的所有Activity彼此关联,优先位于相同任务中。
(2)通过 taskAffinity属性设置关联