这里说的也适用于其它Activity启动时Intent中设置了FLAG_ACTIVITY_NEW_TASK标志。

今天没事翻看android sdk的文档,发现在网上关于launchMode的一些介绍,很多都不是太正确,尤其是关于singleTask,甚至官方文档的介绍都有些问题,自己也写了小demo做了测试,把对singleTask的理解做下总结,如有错误,欢迎拍砖交流。

首先,singleTask不能独立来评价。我在网上看过几篇对launchMode介绍的比较好的几篇文章(http://marshal.easymorse.com/archives/2950,http://blog.csdn.net/liuhe688/article/details/6754323 ),因为只是独立的介绍singleTask, 看过之后再看到官方文档中的“The system creates a new task and instantiates the activity at the root of the new task”不免让人疑惑。
要理解官方文档中这句容易引起歧义的句子,必须要先了解下taskAffinity,下面是关于taskAffinity的介绍。

每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该 Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等于它的根 Activity的taskAffinity的值。

taskAffinity的值是个唯一的String字符串,来自于manifest文件中声明的包名。

官方文档中说了如果一个singleTask的Activity没有已存在的实例,就会新建一个task来存这个activity的实例,而写程序测试的例子是标准的ActivityA启动singleTask的ActivityB,你会发现他们的TaskId是一样的,也就是说创建ActivityB后,并没有把它放到新的task中。如果结合affinity介绍,就好理解一些了:

App1(com.df.test1): ActivityA -> ActivityB -> ActivityC -> ActivityB
App2(com.df.test2): Activity1 -> ActivityB(调用App1中的ActivityB)

1、假设ActivityB设置了launchMode为"singleTask", taskAffinity没有设置(即为包名),(1.1)在App1中它被启动ActivityB时,先去查找有没有与它的taskAffinity匹配的task存在,因为ActivityA与ActivityB的taskAffinity相同,所以会在当前的task中启动ActivityB,此时再启动ActivityC,然后再启动ActivityB,按“Back",会发现回到了ActivityA,即ActivityC启动ActivityB时,在栈中查到了AcvitityB,让它上面的都出栈并激活ActivityB,它们打印出的taskId都一样,这个跟上面两篇文章介绍的一致。

(1.2)在App2中启动ActivityB时:
如果App1没有在后台运行,此时查找与ActivityB的taskAffinity相同的task,发现不存在,会新建一个task启动ActivityB,此时你会发现它们的taskId值不一样;
如果App1在后台运行,系统查找到与ActivityB相同taskAffinity的task,会在这个task中启动(如果App1中栈顶为ActivityC,它会被出栈并激活ActivityB, 如果栈顶为ActivityA,会新建ActivityB),此时,进入顺序为Activity1->ActivityB Back顺序为ActivityB->ActivityA->Activity1.

(1.3)如果App2在后台运行,栈顶为ActivityB,运行App1,你会发现App1直接进入了ActivityB,按Back,直接退出,再激活App2,发现当前界面为Activity1,这个看起来就有些奇怪。

2、假设ActivityB设置了launchMode为"singleTask",taskAffinity设置为com.df.test2(与App2相同)

(2.1)在App1中启动ActivityB时,如果App2没有在后台运行,此时系统查找不到与ActivityB的taskAffinity相同的task,会创建新的task并在其中启动ActivityB,此时,会发现ActivityB的taskId与ActivityA不一样,但与ActivityC的taskId是一样的,因为是它启动的ActivityC,而ActivityC的launchMode又为默认的,此时它的taskAffinity跟task中的Root Activity相同。

如果App2已经在后台运行,系统查找到与ActivityB相同的task,如果ActivityB已在这个task中,直接激活,如果没有,就在这个task中启动ActivityB. 此时,进入顺序:ActivityA -> AcitivytB  back顺序:ActivityB->Activity1->ActivityA

(2.2)在App2中启动ActivityB,会发现它的taskId与Activity1是一样的。

(2.3)如果App1已在后台运行,而且ActivityB已经在栈中,此时运行App2,发现会直接进行ActivitB或ActivityC,在ActivityB界面按Back,直接退出App2.

singleTask 与 taskAffinity 缠绵的那些事相关推荐

  1. Android之用SingleTask和TaskAffinity解决手机截取的项目启动页面问题

    今天做的远程截屏功能,服务端发一个命令下来,然后客户端截屏,截屏的代码已经写好,因为是跨进程通信的,我最后采取的办法是启动activity来实现的,但是问题来了,如果用户没有登录的情况下,可以截屏到任 ...

  2. 对SingleTask和TaskAffinity的理解

    最近研究微信调起自己客户端的事情,对于SingleTask和TaskAffinity的理解又多了一些理解. 以前对于Android的四种LaunchMode有一些了解,其中比较有意思的就是Single ...

  3. 聊聊 Activity 栈的亲和关系

    launchMode <activityandroid:name=".ui.activity.TaskAffinityActivity"android:launchMode= ...

  4. Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity

    上一篇文章粗略地介绍了一下关于Android中Task的基本知识.只是实践才是检验真理的唯一标准,所以.今天就来试验一下Task中的launchMode是否真的实现了文档所说的那样. 首先.定义三个A ...

  5. 一次关于SingleTask的填坑

    原网页:点击打开链接 一次关于SingleTask的填坑 这个milestone客户那边做了一个功能,在做这个功能的时候,那边的开发把我们app中的activity的launchmode给改了.之前我 ...

  6. 解开Android应用程序组件Activity的singleTask之谜(3)

    回到前面的startActivityUncheckedLocked函数中,这里的变量top就为null了,于是执行下面的else语句: if (top != null) { ...... } else ...

  7. android notification设置不同字体颜色,Android Notification自定义通知样式你要知道的事...

    本文将根据个人经验对Notification做个总结,以供参考! 什么是通知(Notification) 通知是一个可以在应用程序正常的用户界面之外显示给用户的消息. 通知发出时,它首先出现在状态栏的 ...

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

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

  9. Notifications(通知)

    通知 通知是能在应用的普通用户界面外显示给用户的一种消息.当你告诉系统发布一条通知时,它首先在通知栏中表现为一枚图标.用户打开通知抽屉后就能查看通知的细节了.通知栏和通知抽屉都是由系统控制的区域,用户 ...

最新文章

  1. 出现adb连接不上的解决办法(转载)
  2. bzoj1503 郁闷的出纳员(平衡树,思维)
  3. synergy共享ubuntu和windows键鼠
  4. 服务器怎么把信息发送给用户,java中怎么用tcp/ip将服务器的消息发送给多个用户...
  5. 计算一个人出生了多少天(炸窝)
  6. python3 Crypto环境
  7. NYOJ-子串和(dp)
  8. mysql索引的创建和删除吗_MySQL索引的创建、删除和查看
  9. HNUCM-1435 最大最小值(分治法)
  10. 单片机c语言表达式,单片机C语言教程:运算符和表达式(位运算符)
  11. 数学建模番外篇1:PPT绘制3D图形
  12. 有趣的java编程题_java编程题 有趣的数
  13. 盘点2017企业服务领域最受关注的100家厂商(BPM平台篇)
  14. 背阔肌(06):T杠俯身划船
  15. 直播回顾|关联网络如何反团伙欺诈——标准答案版
  16. CF596D Wilbur and Trees
  17. 单片机软件定时器V1.0,可大批量创建,操作简单
  18. 大多数人都会遇到的几个H5坑(实战)
  19. SUSE配置zypper
  20. VS2019设置easyx图形库

热门文章

  1. 基于富芮坤fr8016 蓝牙5.0 芯片设计的BLE HID Joystick 游戏摇杆设备
  2. 【软件工程实践】Hive研究-Blog7
  3. php-fpm error 慢执行,php-fpm的pool、php-fpm慢执行日志、open_basedir、php-fpm进程管理
  4. input type属性
  5. oracle的逻辑存储结构中由大到小的顺序,16.2 数据库逻辑存储结构
  6. JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题的解决方法
  7. 2020中兴开发岗笔试题
  8. python 卡方分布函数_卡方检验2-python代码实现
  9. shiro使用Md5加密
  10. 初识python导学案_高中数学 第三章 三角恒等变换 3_2_2 半角的正弦、余弦和正切学案 新人教b版必修4...