Activity 任务栈 taskAffinity 用法
taskAffinity属性
taskAffinity 是 Activity 的一个重要属性,主要用于任务栈管理,通常和singleTask和allowTaskReparenting配合使用;
taskAffinity 主要作用:
1. 任务栈分配:
- 默认情况下,同一应用的 Activity 共享同一个任务栈
- 通过 taskAffinity 可以为 Activity 指定不同的任务栈
- 任务栈名称默认为应用的包名
2. 常见使用场景:
<!-- 场景一:为不同功能模块指定不同任务栈 -->
<activity
android:name=".PayActivity"
android:taskAffinity="com.xxx.xx.pay"
android:launchMode="singleTask">
</activity>
<!-- 场景二:与 FLAG_ACTIVITY_NEW_TASK 配合使用 -->
<activity
android:name=".LoginActivity"
android:taskAffinity="com.xxx.xx.login">
</activity>
3. 使用注意事项:
1. 必须与 launchMode 或 Intent.FLAG_ACTIVITY_NEW_TASK 配合使用
2. 任务栈名称必须包含包名中的点号
3. 不同任务栈的 Activity 数据传递需要特殊处理
4. 会影响返回栈行为
5. 需要考虑内存管理问题
4. 主要应用场景:
1. 多模块应用任务栈隔离
2. 特殊页面独立任务栈
3. 多账户应用场景
4. 应用间跳转管理
allowTaskReparenting 属性
1. 具体作用:
- 允许 Activity 在运行时从一个 Task 转移到另一个 Task
- 通常发生在原 Activity 所属的应用被启动时
2. 示例:
// 场景:应用 A 启动了应用 B 的 ActivityB
// ActivityB 配置了 allowTaskReparenting="true"
// 1. 初始状态
Task A (前台):
- ActivityA (应用A)
- ActivityB (应用B) // 此时在应用A的Task中
// 2. 用户按 Home,然后启动应用B
Task A (后台):
- ActivityA (应用A)
Task B (前台):
- ActivityB (应用B) // 自动转移到应用B的Task中
3. 常见应用场景:
- 浏览器打开的网页
- 社交分享功能
- 应用间跳转
- 推送消息打开的页面
4. 注意事项:
// 1. Task 亲和性要匹配
<activity
android:taskAffinity="com.example.app"
android:allowTaskReparenting="true" />
// 2. 生命周期影响
@Override
protected void onTaskReparented(Intent intent) {
super.onTaskReparented(intent);
// Activity 迁移到新 Task 时回调
}
5. 使用建议:
- 谨慎使用,可能影响用户体验
- 考虑返回栈的完整性
- 注意数据传递的问题
- 处理好生命周期回调