Andorid之taskAffinity 和 FLAG_ACTIVITY_NEW_TASK
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相关推荐
- 【Android 应用开发】Activity 任务亲和性 taskAffinity 设置 ( taskAffinity 属性 )
文章目录 I . 任务亲和性 ( taskAffinity ) 简介 II . 任务亲和性 ( taskAffinity ) 设置 III . 任务亲和性 ( taskAffinity ) 与 FLA ...
- android 当中taskAffinity属性与launchMode相关
一.本文尝试解释以下问题 1. Activity被启动之后放在哪个任务栈当中?与哪些因素有关? 2. Activity的四种启动模式对Activity的启动有哪些影响? 3. 在Activity ...
- Android启动模式详解
"在整理完启动模式后,我发现大家对启动模式的理解是有误区的" 引言 再谈启动模式,貌似没啥意思.但是你能正确回答下面的问题吗? 问题1:singleTask启动模式,在启动新的Ac ...
- 【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task
文章目录 一.打印 Android 中当前运行的 Activity 任务栈信息 二.Activity 任务栈信息分析 三.Activity 在相同 Stack 的不同 Task 情况 一.打印 And ...
- 解析ActivityManagerService
解析 ActivityManagerService Android 系统启动过程.应用程序进程启动过程以及四大组件工作过程,都涉及了 ActivityManagerService(以后简 ...
- 第一章 四大组件 之 Activity(一)
文章目录 第一组件 Activity (一)Activity生命周期 1.生命周期五大状态 2.生命周期流程 3.常见场景的生命周期调用方式 4.具体场景生命周期调用方式 (1)横竖屏切换对Activ ...
- Activity栈管理(三):Intent的Flag与taskAffinity
作者:anly_jun 链接:https://www.jianshu.com/p/c97688eb5056 引用上文生命周期和launchMode介绍, Activity的生命周期实际上比我们想象的复 ...
- 【Android 进程保活】提升进程优先级 ( 1 像素 Activity 提高进程优先级 | taskAffinity 亲和性说明 | 运行效果 | 源码资源 )
文章目录 一.1 像素 Activity 提高进程优先级 1.主界面 MainActivity 2.1 像素 Activity 3.广播接收者 4.管理类 5.AndroidManifest.xml ...
- taskAffinity(Activity默认Application,Application默认包名,Task默认根Activity) singleInstance放入新栈
Application的taskAffinity默认值为包名 Activity的taskAffinity默认值为application的taskAffinity值 Task的taskAffinity默 ...
最新文章
- linux firefox xvfb,自动化测试之linux+xvfb+selenium+firefox+python测试环境搭建与测试
- python空值赋0_Python中的空值判断
- Swoole的TCP/IP HTTP WebSocket关系
- 修复虚拟磁盘LVM表
- cobbler基础安装
- 深圳dotnet俱乐部新群
- Random Forest算法中的参数详解
- 解决IntelliJ IDEA 创建Maven项目速度慢问题 DarchetypeCatalog
- 啦啦外卖独立版41.4最新外卖源码全开源带vue源码
- 126邮箱登录html,126邮箱登陆界面
- 2022年深圳市集成电路专项资助计划项目申报条件及材料,补贴3000万
- LRC 文件格式定义
- 网页超链接无法访问本地文件
- 状态方程simulink仿真_控制系统设计与仿真作业与复习资料
- 计算机最新行情调研报告,2020年中国笔记本电脑市场调研报告
- EF系列(一)——深入框架底层
- netsh interface portproxy本地ip与端口映射及本地虚拟ip(windows)
- 《Primes is in P》学习笔记
- 计算机图画大赛作品六年级,小学六年级优秀绘画作品图片精选
- 自己整理的小学教师资格证结构化面试题分享
热门文章
- 机器信息MachineInfo
- 【招聘(上海)】 坚果云 招聘Windows客户端(WPF方向)
- AgileConfig-轻量级配置中心 1.1.0 发布,支持应用间配置继承
- .NET应用程序7种最常见的性能问题及其解决方案
- 秋天 | 等疫情过后,我们继续背起相机去旅行
- 使用 C# 捕获进程输出
- .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记
- AOP框架Dora.Interception 3.0 [1]: 编程体验
- 微软.Net Core 3.0 预览版7发布:大幅减少 SDK 空间大小
- 译 | 使用Roslyn分析器高效编写更好的代码