android:allowTaskReparenting实例
来源:互联网 发布:py是什么意思网络用语 编辑:程序博客网 时间:2024/05/05 13:22
allowTaskReparenting的主要作用是activity的迁移,即从一个task迁移到另一个task,这个迁移跟activity的taskAffinity有关,必须是从一个跟该activity taskAffinity不同的task中迁移到跟它taskAffinity相同的task中,且看了下android源代码,只有在发生rese ttask时才会去使用这个标志,而我们从home上启动的程序都带了FLAG_ACTIVITY_RESET_TASK_IF_NEEDED。所以从home上启动程序会进行task reset.也就会使用到这个allowTaskReparenting。
下面来进行我们的测试:
有两个apk:
apk1中含有三个Activity:MainActivity,ActivityB,ActivityB设置了allowTaskReparenting为false.
apk2中含有一个activity:MainActivityB,MainActivityB点击的时候会启动ActivityB
首先我们启动apk2,进入MainActivityB,点击MainActivityB会进入ActivityB,我们看下 这个时候的堆栈:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{419878b0 #82 A com.example.testactivitylaunchflag2 U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } Hist #3: ActivityRecord{413c99d8 u0 com.leaves.ipanel/.ActivityB} Intent { act=com.leaves.ipanel.ActivityB cmp=com.leaves.ipanel/.ActivityB } ProcessRecord{413cba38 15618:com.leaves.ipanel/u0a10061} Hist #2: ActivityRecord{41984600 u0 com.example.testactivitylaunchflag2/.MainActivityB} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } ProcessRecord{413bccb8 15600:com.example.testactivitylaunchflag2/u0a10063} TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #1: 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} TaskRecord{413cdd58 #69 A com.android.systemui U 0} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10c00000 cmp=com.android.systemui/.recent.RecentsActivity (has extras) } Hist #0: ActivityRecord{41429718 u0 com.android.systemui/.recent.RecentsActivity} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity bnds=[550,3495][862,3690] (has extras) } ProcessRecord{414125b0 464:com.android.systemui/u0a10012}这个时候按Home键,查看堆栈:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #3: 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} TaskRecord{419878b0 #82 A com.example.testactivitylaunchflag2 U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } Hist #2: ActivityRecord{413c99d8 u0 com.leaves.ipanel/.ActivityB} Intent { act=com.leaves.ipanel.ActivityB cmp=com.leaves.ipanel/.ActivityB } ProcessRecord{413cba38 15618:com.leaves.ipanel/u0a10061} Hist #1: ActivityRecord{41984600 u0 com.example.testactivitylaunchflag2/.MainActivityB} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } ProcessRecord{413bccb8 15600:com.example.testactivitylaunchflag2/u0a10063} TaskRecord{413cdd58 #69 A com.android.systemui U 0} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10c00000 cmp=com.android.systemui/.recent.RecentsActivity (has extras) } Hist #0: ActivityRecord{41429718 u0 com.android.systemui/.recent.RecentsActivity} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity bnds=[550,3495][862,3690] (has extras) } ProcessRecord{414125b0 464:com.android.systemui/u0a10012}可以看到MainActivityB和ActivityB移动到了后台
在从Home启动apk1:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{423314b8 #83 A com.leaves.ipanel U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.leaves.ipanel/.MainActivity bnds=[63,1124][207,1268] } Hist #4: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.leaves.ipanel/.MainActivity bnds=[63,1124][207,1268] } ProcessRecord{413cba38 15618: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=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #3: 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} TaskRecord{419878b0 #82 A com.example.testactivitylaunchflag2 U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } Hist #2: ActivityRecord{413c99d8 u0 com.leaves.ipanel/.ActivityB} Intent { act=com.leaves.ipanel.ActivityB cmp=com.leaves.ipanel/.ActivityB } ProcessRecord{413cba38 15618:com.leaves.ipanel/u0a10061} Hist #1: ActivityRecord{41984600 u0 com.example.testactivitylaunchflag2/.MainActivityB} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } ProcessRecord{413bccb8 15600:com.example.testactivitylaunchflag2/u0a10063} TaskRecord{413cdd58 #69 A com.android.systemui U 0} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10c00000 cmp=com.android.systemui/.recent.RecentsActivity (has extras) } Hist #0: ActivityRecord{41429718 u0 com.android.systemui/.recent.RecentsActivity} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity bnds=[550,3495][862,3690] (has extras) } ProcessRecord{414125b0 464:com.android.systemui/u0a10012}这个时候只是简单添加了一个MainActivity.虽然从Home启动apk2的时候带有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,但在任务重置的过程中什么事也没有做。
我们把ActivityB的allowTaskReparenting改为true,这个时候前面的步骤一样,当我们从Home启动apk2时,我们惊奇的发现,启动的竟然是ActivityB,可以看到此时的堆栈:
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Main stack: TaskRecord{41802828 #86 A com.leaves.ipanel U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.leaves.ipanel/.MainActivity } Hist #4: ActivityRecord{41840a38 u0 com.leaves.ipanel/.ActivityB} Intent { act=com.leaves.ipanel.ActivityB cmp=com.leaves.ipanel/.ActivityB } ProcessRecord{431e8a80 15785:com.leaves.ipanel/u0a10061} Hist #3: ActivityRecord{41802640 u0 com.leaves.ipanel/.MainActivity} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.leaves.ipanel/.MainActivity } TaskRecord{41350f60 #2 A com.android.launcher U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10600000 cmp=com.android.launcher/com.android.launcher2.Launcher } Hist #2: 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} TaskRecord{416dd178 #85 A com.example.testactivitylaunchflag2 U 0} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } Hist #1: ActivityRecord{42401f10 u0 com.example.testactivitylaunchflag2/.MainActivityB} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.testactivitylaunchflag2/.MainActivityB bnds=[435,1124][579,1268] } ProcessRecord{4140d318 15767:com.example.testactivitylaunchflag2/u0a10063} TaskRecord{413cdd58 #69 A com.android.systemui U 0} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10c00000 cmp=com.android.systemui/.recent.RecentsActivity (has extras) } Hist #0: ActivityRecord{41429718 u0 com.android.systemui/.recent.RecentsActivity} Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS flg=0x10800000 cmp=com.android.systemui/.recent.RecentsActivity bnds=[550,3495][862,3690] (has extras) } ProcessRecord{414125b0 464:com.android.systemui/u0a10012}跟显示的结果是一样的,这是由于重置任务的时候把它迁移到了新启动的task中。后面我们分析android源码中的resetTaskIfNeededLocked函数时就会明白这个是怎么回事了。
- android:allowTaskReparenting实例
- android:allowTaskReparenting实例
- android:taskAffinity && android:allowTaskReparenting
- android:allowTaskReparenting(clearTaskOnLaunch...)
- android:allowTaskReparenting(clearTaskOnLaunch...)
- android taskAffinity allowTaskReparenting
- android:allowTaskReparenting(clearTaskOnLaunch...)
- Android-App manifest-allowTaskReparenting
- Android allowTaskReparenting clearTaskOnLaunch alwaysRetainTaskState
- taskAffinity和allowTaskReparenting的实例
- android中的android:taskAffinity,allowTaskReparenting 等属性
- android的taskAffinity和allowTaskReparenting的用途
- activity 的属性android:taskAffinity和android:allowTaskReparenting
- activity 的属性android:taskAffinity和android:allowTaskReparenting
- Android manifest中actvity下的android:allowTaskReparenting等配置
- android--Manifest文件中allowTaskReparenting属性的含义
- alwaysRetainTaskState,allowTaskReparenting
- allowTaskReparenting属性
- 目标检测的图像特征提取之(三)Haar特征
- 迅雷7.9.11.4626 优化版
- ROS的学习(十五)验证publisher和subscriber
- Android接收短信并读取
- HashMap 小例子
- android:allowTaskReparenting实例
- uva 701 - The Archeologists' Dilemma
- numpy数组与python的list互转,然后用json写入文件与c交互
- .py to .exe (by py2exe)
- 不是技术牛人,如何拿到国内IT巨头的Offer
- 基于STK的编队飞行队形保持控制及仿真
- 计算机图形学 -- Reshape函数
- 矩阵快速幂--模板
- 养心莫若寡欲