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函数中进行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目 报错】 项目启动,内存溢出 可能出现的各种报错

内存溢出可能有如下的错误&#xff1a; 错误1&#xff1a; java.lang.OutOfMemoryError: PermGen space 错误2&#xff1a; Exception in thread "http-apr-8080-exec-2" 出现如上的错误&#xff0c;解决方法如下&#xff1a; 1.双击Tomcat 2.点击open launch config…

杨中科的.NET 6新书的出版进度汇报

各位朋友好&#xff0c;我有3个月没发公众号了&#xff0c;今天打扰大家一下&#xff0c;不好意思。最近这3个月&#xff0c;我在忙着给我的.NET 6新书收尾&#xff0c;并且在.NET 6正式版发布后&#xff0c;我把书中用.NET 6 预览版编写的内容在.NET 6正式版中又验证了一遍&am…

2021,如何找到适合自己的圈子?

全世界只有3.14 % 的人关注了爆炸吧知识蔡康永分享过这样一段话&#xff1a;“小S的个性本身就是很乐天&#xff0c;很有活力&#xff0c;她这个朋友让我觉得活着是一件很值得、很舒服、很有趣的事。而有的人会让我觉得活着很没劲&#xff0c;碰到他会把我的能量都吸走”。你和…

Android之用Intent.FLAG_ACTIVITY_CLEAR_TOP解决界面重复拉起问题

今天遇到了一个问题: 就是界面在服务拉起来用的Intent.FLAG_ACTIVITY_NEW_TASK导致登录界面拉起很多次,登录还要登录,主要是之前的activity没有关闭 用it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP)解决。 A - B - C 当 B - A - B 跳转的时…

抓图实例

//调用动态链接库gdi32.dll[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]private static extern bool BitBlt (IntPtr hdcDest , //目标设备的句柄int nXDest , // 目标对象的左上角的X坐标int nYDest , // 目标对象的左上角的X坐标int nW…

代码Review发现问题

FrmMain.cs中存在问题 1. int i0 设定为了全局常量且未在类顶部&#xff0c;出现问题时不好查找 i 属于常用临时变量&#xff0c;设定全局变量容易引起混乱 2.定义的全局变量但仅在一处方法中使用&#xff0c;定义全局变量过多 3.变量名及控件名等意义不明确又缺少注释&#xf…

I/O多路转接之poll——基于TCP协议

1. 函数a. 参数&#xff1a;&#xff08;1&#xff09;fds:是一个struct pollfd结构类型的指针&#xff0c;指向用于存放需要检测状态的Socket描述符&#xff1b;每当调用这个函数之后&#xff0c;系统不会清空这个数组&#xff0c;操作起来比较方便&#xff1b;特别是对于sock…

Android之 FLAG_ACTIVITY_CLEAR_TASK

FLAG_ACTIVITY_CLEAR_TASK :如果在调用Context.startActivity时传递这个标记&#xff0c;将会导致任何用来放置该activity的已经存在的task里面的已经存在 的activity先清空&#xff0c;然后该activity再在该task中启动&#xff0c;也就是说&#xff0c;这个新启动的activity变…

C# 日志管理框架:Common.Logging和log4net

01—DLL引用‍common logging是一个通用日志接口框架&#xff0c;log4net是一个强大的具体实现框架. common logging可以把输出连接到其他非log类上, 如EntLib的日志、NLog等‍‍‍‍‍‍‍‍‍‍‍‍‍‍项目中需要引入的DLL:Common.Logging.dllCommon.Logging.Core.dllCommon…

boost常用记录

1.BOOST_FOREACH 经常会遍历容器&#xff0c;写for/while循环到手痛&#xff0c;使用BOOST_FOREACH可以减少我们的工作。支持容器vector/list/set/deque/stack/queue#include <boost/foreach.hpp> BOOST_FOREACH(value,container){ //遍历每个元素 } 例子&#xff1a; ve…

Cacti迁移RRA数据迁移脚本

迁移程序和数据库完成后&#xff0c;默认的rra数据并不能出图&#xff0c; 需要从旧机器上将rra数据导出到新机器上&#xff0c;附上脚本 #导出rra数据 #!/bin/bash rrddump"/usr/bin/rrdtool dump" xmldir/data/rraxml/ rradir/var/www/html/cacti/rra/ for file in…

Android之FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_SINGLE_TOP :如果当前栈顶的activity就是要启动的activity,则不会再启动一个新的activity实例&#xff1a;我们有一个apk&#xff0c;apk中包含两个Activity:MainActivity和ActivityA&#xff0c;点击MainActivity启动ActivityA,点击ActivityA还是启动ActivityA&…

我开发了一个对.NET程序进行瘦身的工具

我开发了一个对.Net程序瘦身的工具&#xff0c;可以把被引用但是没有被使用的程序集删除。我用它把一个.Net core程序从147兆瘦身到59.5兆。.NET中发布程序的时候有对程序集进行剪裁的功能&#xff0c;但是那个功能只能做静态检查。比如我们的项目使用了A程序集&#xff0c;A程…

三联竟出了这么赞的杂志!各领域佼佼者畅所欲言,为少年建立思维判断体系!

▲点击查看很多中国小孩的成长是断层的。10岁前被视作可爱稚子&#xff0c;被大人护着走&#xff1b;18岁猛然被定义为成年人&#xff0c;要选择大学、专业&#xff0c;开始面对感情。中间的人生呢&#xff1f;“你是个学生&#xff0c;学习是本职&#xff0c;现在谈什么人生&a…

源码lnmp

1、准备工作&#xff1a;配置yum源安装开发工具、编译工具gcc gcc-c make配置固定ip地址 关闭iptables selinuxnetstat -anpult | grep :3306netstat -anpult | grep :80若端口占用kill并service httpd stop ; chkconfig httpd offservice mysqld stop ; chkconfig mysqld off …

IIS书籍

book.51cto.com/art/200908/146040.htm

基于'sessionStorage'与'userData'的类session存储

Storage.js&#xff1a; 注意&#xff1a;此版本实现的存储在符合Web存储标准(ie8及ie8以上的版本与其他主流浏览器)的情况下与session的周期一致,但在页面不关闭的情况下没有过期时间,ie7及以下版本则默认是永久保存&#xff0c;但可以通过预留的方法setMaxAge(Number age)来设…

Android之FLAG_ACTIVITY_TASK_ON_HOME

FLAG_ACTIVITY_TASK_ON_HOME :把当前新启动的任务置于Home任务之上&#xff0c;也就是按back键从这个任务返回的时候会回到home&#xff0c;即使这个不是他们最后看见的activity 注意这个标记必须和FLAG_ACTIVITY_NEW_TASK一起使用。 实例&#xff1a; 一个apk中有MainActiv…

C# WPF中添加调试信息查看窗体

第一步&#xff1a;添加wpf窗口&#xff1b;第二步&#xff1a;在主窗体image的MouseLeftButtonUp事件中调用调试窗口&#xff1b;StatusViewWindow svWindow new StatusViewWindow();svWindow.Show();第三步&#xff1a;在主窗体中开个线程通过udp接收光电广开的数据&#xf…