taskAffinity 和 FLAG_ACTIVITY_NEW_TASK都是和activity启动时是否需要新建一个task有关,我们分四种情况看一下这两个标志对启动activity的影响:(前提:从MainActivity中启动ActivityA)

1)、两个标志都不设置
2)、有FLAG_ACTIVITY_NEW_TASK  
3)、无FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同于MainActivity)
4)、有FLAG_ACTIVITY_NEW_TASK有taskAffinity

注意上面的标志都是针对于启动的ActivityA,FLAG_ACTIVITY_NEW_TASK  是在启动ActivityA的Intent中设置的,taskAffinity 是在AndroidManifest中ActivityA中设置,另外注意这里两个actiity的启动模式都设置为standard

1、先看第一中情况:

主要代码:

    <activity android:name=".ActivityA"    android:launchMode="standard"  android:label="@string/title_activityA">    <intent-filter>    <action android:name="com.leaves.ipanel.ActivityA"/>    <category android:name="android.intent.category.DEFAULT"/>    </intent-filter>    </activity>   

MainActivity启动activity

    public void onClick(View arg0) {  // TODO Auto-generated method stub  Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  Intent intent = new Intent("com.leaves.ipanel.ActivityA");      startActivity(intent);   }  

启动A之后的堆栈:

    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  Main stack:  TaskRecord{415ebce8 #37 A com.leaves.ipanel U 0}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  Hist #2: ActivityRecord{42358368 u0 com.leaves.ipanel/.ActivityA}  Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA }  ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  Hist #1: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  TaskRecord{41350f60 #2 A com.android.launcher U 0}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  ProcessRecord{41615818 628:com.android.launcher/1000}  

可见,跟启动他的activity同属于一个task.

2、有FLAG_ACTIVITY_NEW_TASK

我们添加FLAG_ACTIVITY_NEW_TASK

    public void onClick(View arg0) {  // TODO Auto-generated method stub  Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  Intent intent = new Intent("com.leaves.ipanel.ActivityA");      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  startActivity(intent);   }  

启动A之后的堆栈

    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  Main stack:  TaskRecord{415ebce8 #37 A com.leaves.ipanel U 0}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  Hist #2: ActivityRecord{42358368 u0 com.leaves.ipanel/.ActivityA}  Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA }  ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  Hist #1: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  TaskRecord{41350f60 #2 A com.android.launcher U 0}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  ProcessRecord{41615818 628:com.android.launcher/1000}  

可见,跟启动他的activity还是同属于一个task.

3、无FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同于MainActivity)

    public void onClick(View arg0) {  // TODO Auto-generated method stub  Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  Intent intent = new Intent("com.leaves.ipanel.ActivityA");      startActivity(intent);   }  
    <activity android:name=".ActivityA"    android:launchMode="standard"  android:taskAffinity="com.leaves.test.ActivityA"  android:label="@string/title_activityA">    <intent-filter>    <action android:name="com.leaves.ipanel.ActivityA"/>    <category android:name="android.intent.category.DEFAULT"/>    </intent-filter>    </activity>   

查看一下启动A之后的堆栈:

    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  Main stack:  TaskRecord{415ebce8 #37 A com.leaves.ipanel U 0}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  Hist #2: ActivityRecord{42358368 u0 com.leaves.ipanel/.ActivityA}  Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA }  ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  Hist #1: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  TaskRecord{41350f60 #2 A com.android.launcher U 0}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  ProcessRecord{41615818 628:com.android.launcher/1000}  

跟前面两种情况是一样的。

4、有FLAG_ACTIVITY_NEW_TASK有taskAffinity

把FLAG_ACTIVITY_NEW_TASK添加上去

    public void onClick(View arg0) {  // TODO Auto-generated method stub  Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  Intent intent = new Intent("com.leaves.ipanel.ActivityA");      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  startActivity(intent);   }  

查看一下启动A之后的堆栈:

    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  Main stack:  TaskRecord{4140d4c8 #42 A com.leaves.test.ActivityA U 0}  Intent { act=com.leaves.ipanel.ActivityA flg=0x10000000 cmp=com.leaves.ipanel/.ActivityA }  Hist #2: ActivityRecord{416b48d8 u0 com.leaves.ipanel/.ActivityA}  Intent { act=com.leaves.ipanel.ActivityA flg=0x10000000 cmp=com.leaves.ipanel/.ActivityA }  ProcessRecord{41393ed0 8028:com.leaves.ipanel/u0a10061}  TaskRecord{4231cf40 #41 A com.leaves.ipanel U 0}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  Hist #1: ActivityRecord{413c8430 u0 com.leaves.ipanel/.MainActivity}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  ProcessRecord{41393ed0 8028:com.leaves.ipanel/u0a10061}  TaskRecord{41350f60 #2 A com.android.launcher U 0}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}  Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  ProcessRecord{41615818 628:com.android.launcher/1000}  

可以看到,这次终于在一个新的task中启动了ActivityA.

上面我们测试的两个Activity是在同一个应用中,如果他们在不同的应用中呢,例如ActivityA跟MainActivity不在一个apk中,其实情况还是一样的,只是这个时候,如果没有在AndroidManifest.xml中设置taskAffinity,则他们两个的taskAffinity是不一样的。因为默认如果没有设置taskAffinity,则taskAffinity跟包名是一样的,所以,如果ActivityA跟MainActivity不在一个apk中,当没有FLAG_ACTIVITY_NEW_TASK时,则两者应该是在同一个task,但是如果有FLAG_ACTIVITY_NEW_TASK,则两者应该会在不同的task中。

总结:

如果没有设置FLAG_ACTIVITY_NEW_TASK,且是从一个activity中启动另一个activity,即sourceRecord不为null,则设置新启动的TaskRecord为即sourceRecord的TaskRecord
如果设置了FLAG_ACTIVITY_NEW_TASK,则根据task的 affinity、intent、ComponentName等查找是否有合适的TaskRecord

这些工作的解析还是在ActivityStack.Java的startActivityUncheckedLocked函数中进行的。

Andorid之taskAffinity 和 FLAG_ACTIVITY_NEW_TASK相关推荐

  1. 【Android 应用开发】Activity 任务亲和性 taskAffinity 设置 ( taskAffinity 属性 )

    文章目录 I . 任务亲和性 ( taskAffinity ) 简介 II . 任务亲和性 ( taskAffinity ) 设置 III . 任务亲和性 ( taskAffinity ) 与 FLA ...

  2. android 当中taskAffinity属性与launchMode相关

    一.本文尝试解释以下问题 1.  Activity被启动之后放在哪个任务栈当中?与哪些因素有关? 2.  Activity的四种启动模式对Activity的启动有哪些影响? 3.  在Activity ...

  3. Android启动模式详解

    "在整理完启动模式后,我发现大家对启动模式的理解是有误区的" 引言 再谈启动模式,貌似没啥意思.但是你能正确回答下面的问题吗? 问题1:singleTask启动模式,在启动新的Ac ...

  4. 【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task

    文章目录 一.打印 Android 中当前运行的 Activity 任务栈信息 二.Activity 任务栈信息分析 三.Activity 在相同 Stack 的不同 Task 情况 一.打印 And ...

  5. 解析ActivityManagerService

    解析 ActivityManagerService        Android 系统启动过程.应用程序进程启动过程以及四大组件工作过程,都涉及了 ActivityManagerService(以后简 ...

  6. 第一章 四大组件 之 Activity(一)

    文章目录 第一组件 Activity (一)Activity生命周期 1.生命周期五大状态 2.生命周期流程 3.常见场景的生命周期调用方式 4.具体场景生命周期调用方式 (1)横竖屏切换对Activ ...

  7. Activity栈管理(三):Intent的Flag与taskAffinity

    作者:anly_jun 链接:https://www.jianshu.com/p/c97688eb5056 引用上文生命周期和launchMode介绍, Activity的生命周期实际上比我们想象的复 ...

  8. 【Android 进程保活】提升进程优先级 ( 1 像素 Activity 提高进程优先级 | taskAffinity 亲和性说明 | 运行效果 | 源码资源 )

    文章目录 一.1 像素 Activity 提高进程优先级 1.主界面 MainActivity 2.1 像素 Activity 3.广播接收者 4.管理类 5.AndroidManifest.xml ...

  9. taskAffinity(Activity默认Application,Application默认包名,Task默认根Activity) singleInstance放入新栈

    Application的taskAffinity默认值为包名 Activity的taskAffinity默认值为application的taskAffinity值 Task的taskAffinity默 ...

最新文章

  1. linux firefox xvfb,自动化测试之linux+xvfb+selenium+firefox+python测试环境搭建与测试
  2. python空值赋0_Python中的空值判断
  3. Swoole的TCP/IP HTTP WebSocket关系
  4. 修复虚拟磁盘LVM表
  5. cobbler基础安装
  6. 深圳dotnet俱乐部新群
  7. Random Forest算法中的参数详解
  8. 解决IntelliJ IDEA 创建Maven项目速度慢问题 DarchetypeCatalog
  9. 啦啦外卖独立版41.4最新外卖源码全开源带vue源码
  10. 126邮箱登录html,126邮箱登陆界面
  11. 2022年深圳市集成电路专项资助计划项目申报条件及材料,补贴3000万
  12. LRC 文件格式定义
  13. 网页超链接无法访问本地文件
  14. 状态方程simulink仿真_控制系统设计与仿真作业与复习资料
  15. 计算机最新行情调研报告,2020年中国笔记本电脑市场调研报告
  16. EF系列(一)——深入框架底层
  17. netsh interface portproxy本地ip与端口映射及本地虚拟ip(windows)
  18. 《Primes is in P》学习笔记
  19. 计算机图画大赛作品六年级,小学六年级优秀绘画作品图片精选
  20. 自己整理的小学教师资格证结构化面试题分享

热门文章

  1. 机器信息MachineInfo
  2. 【招聘(上海)】 坚果云 招聘Windows客户端(WPF方向)
  3. AgileConfig-轻量级配置中心 1.1.0 发布,支持应用间配置继承
  4. .NET应用程序7种最常见的性能问题及其解决方案
  5. 秋天 | 等疫情过后,我们继续背起相机去旅行
  6. 使用 C# 捕获进程输出
  7. .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记
  8. AOP框架Dora.Interception 3.0 [1]: 编程体验
  9. 微软.Net Core 3.0 预览版7发布:大幅减少 SDK 空间大小
  10. 译 | 使用Roslyn分析器高效编写更好的代码