其运行日志如下:

2021-04-04 22:45:03.650 17626-17626/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43112
2021-04-04 22:45:14.365 17626-17626/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 43112
2021-04-04 22:45:14.803 17626-17626/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43112

如果当前栈中存在SingleTaskActivity的实例,则调用该实例的onNewIntent()方法,并清空任务栈中该实例之上的所有activity的实例,并将其置于栈顶。其调用图如图4所示:

图4 任务栈中存在实例对象时启动SingleTaskActivity

其运行日志如下:

2021-04-04 22:45:03.650 17626-17626/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43112
2021-04-04 22:45:14.365 17626-17626/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 43112
2021-04-04 22:45:14.803 17626-17626/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43112
2021-04-04 22:45:27.204 17626-17626/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43112
2021-04-04 22:45:27.614 17626-17626/com.example.myfirstapp I/System.out: SingleTaskActivity Stop. Task Id: 43112
2021-04-04 22:45:32.225 17626-17626/com.example.myfirstapp I/System.out: SingleTaskActivity onNewIntent. Task Id: 43112
2021-04-04 22:45:32.620 17626-17626/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43112
2021-04-04 22:45:32.621 17626-17626/com.example.myfirstapp I/System.out: MainActivity Destroy. Task Id: 43112

2.2 启动singleTask (声明taskAffinity)

taskAffinity表示activity在应用中所属的任务栈。

启动应用后,系统当前任务栈如图5所示:

图5 应用启动默认任务栈

MainActivity启动SingleTaskAffinityActivity时,SingleTaskAffinityActivity所属的任务栈为**com.example.myfirstapp.a1**(见上述代码片段)。由于系统中没有该任务栈,因此系统创建一个新的任务栈,并在该任务栈中创建SingleTaskAffinityActivity的实例对象。将新建的任务栈转为前台任务栈,原先的任务栈该为在后台运行。其调用图如图6所示:

图6 默认任务栈启动SingleTaskAffinityActivity并创建新任务栈

其运行日志如下:

2021-04-04 22:46:01.608 19083-19083/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43113
2021-04-04 22:46:10.912 19083-19083/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 43114
2021-04-04 22:46:11.427 19083-19083/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43113

如果内存中存在com.example.myfirstapp.a1任务栈且其中存在SingleTaskAffinityActivity的实例对象时,MainActivity启动SingleTaskAffinityActivity,系统会调用SingleTaskAffinityActivityonNewIntent()方法并销毁com.example.myfirstapp.a1任务栈中在该实例对象之上所有的实例,并将SingleTaskAffinityActivity的实例对象置于栈顶。同时系统将com.example.myfirstapp.a1设置为前台任务栈,将原先任务栈转为后台运行。其调用图如图7所示:

图7 系统存在a1任务栈且该栈中存在该实例对象时从默认任务栈启动SingleTaskAffinityActivity

其运行日志如下:

2021-04-04 22:46:01.608 19083-19083/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43113
2021-04-04 22:46:10.912 19083-19083/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 43114
2021-04-04 22:46:11.427 19083-19083/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43113
2021-04-04 22:46:33.892 19083-19083/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43114
2021-04-04 22:46:34.304 19083-19083/com.example.myfirstapp I/System.out: SingleTaskAffinity Stop. Task Id: 43114
2021-04-04 22:46:48.987 19083-19083/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43114
//以上为前期准备日志
//以下为上图流程日志
2021-04-04 22:46:53.976 19083-19083/com.example.myfirstapp I/System.out: MainActivity Destroy. Task Id: 43114
2021-04-04 22:46:53.999 19083-19083/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity onNewIntent. Task Id: 43114
2021-04-04 22:46:54.567 19083-19083/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43113

如果在其他任务栈中启动SingleTaskActivity,首先寻找系统中是否存在默认任务栈,若存在且该任务栈中不存在SingleTaskActivity实例对象,则将默认任务栈转为前台任务栈且创建SingleTaskActivity实例对象并置于栈顶。其调用图如图8所示:

图8 默认任务栈中不存在实例时在其他任务栈启动SingleTaskActivity

其运行日志如下:

2021-04-05 22:04:41.784 32718-32718/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43226
2021-04-05 22:04:46.692 32718-32718/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 43227
2021-04-05 22:04:47.202 32718-32718/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43226
//以上为前期准备日志
//以下为上图流程日志
2021-04-05 22:06:00.211 32718-32718/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 43226
2021-04-05 22:06:00.832 32718-32718/com.example.myfirstapp I/System.out: SingleTaskAffinity Stop. Task Id: 43227

如果在其他任务栈中启动SingleTaskActivity,系统中存在默认任务栈且该任务栈中存在SingleTaskActivity的实例对象,则将默认任务栈转为前台任务栈并调用SingleTaskActivity实例对象的onNewIntent()方法,销毁栈中该实例对象之上的所有实例。其调用图如图9所示:

图9 默认任务栈中存在该实例时在其他任务栈启动SingleTaskActivity

其运行日志如下:

2021-04-05 22:17:20.479 13497-13497/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43228
2021-04-05 22:17:28.142 13497-13497/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 43228
2021-04-05 22:17:28.564 13497-13497/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43228
2021-04-05 22:17:29.455 13497-13497/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43228
2021-04-05 22:17:29.865 13497-13497/com.example.myfirstapp I/System.out: SingleTaskActivity Stop. Task Id: 43228
2021-04-05 22:17:38.971 13497-13497/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 43229
2021-04-05 22:17:39.450 13497-13497/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43228
//以上为前期准备日志
//以下为上图流程日志
2021-04-05 22:18:01.954 13497-13497/com.example.myfirstapp I/System.out: MainActivity Destroy. Task Id: 43228
2021-04-05 22:18:01.975 13497-13497/com.example.myfirstapp I/System.out: SingleTaskActivity onNewIntent. Task Id: 43228
2021-04-05 22:18:02.550 13497-13497/com.example.myfirstapp I/System.out: SingleTaskAffinity Stop. Task Id: 43229

如果在其他任务栈中启动SingleTaskActivity,系统中不存在默认任务栈,则创建一个任务栈,将该任务栈置为前台任务栈并在该任务栈中创建SingleTaskActivity实例对象。其调用图如图10所示:

图10 系统只存在一个任务栈时在非所属任务栈中启动SingleTaskActivity

其运行日志如下:

2021-04-05 22:24:22.218 23571-23571/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 43233
2021-04-05 22:24:24.994 23571-23571/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 43234
2021-04-05 22:24:25.482 23571-23571/com.example.myfirstapp I/System.out: SingleTaskAffinity Stop. Task Id: 43233

2.3 使用FLAG_ACTIVITY_NEW_TASK启动

使用FLAG_ACTIVITY_NEW_TASK启动activity时,系统通常会创建一个新的任务栈。但如果系统中已经存在该activity所属的任务栈时,该activity则会在对应任务栈中启动。其启动流程与singleTask相同,但实例创建方式还是遵循在Manifest文件中声明的启动模式规则

如果使用FLAG_ACTIVITY_NEW_TASK启动的activity所属的任务栈与启动他的activity的任务栈相同,则在同一个任务栈中创建或复用该activity的实例对象。

启动应用后,系统当前任务栈如图11所示:

图11 应用启动默认任务栈

MainActivity使用FLAG_ACTIVITY_NEW_TASK启动MainActivity时,由于系统已经存在MainActivity所属的任务栈且MainActivity的启动模式为standard,因此系统会在原有任务栈上创建新的MainActivity实例对象。再用新启动的MainActivity实例启动SingleTaskActivity时,流程同singleTask的启动模式相同。如图12所示:

图12 MainActivity使用FLAG_ACTIVITY_NEW_TASK启动MainActivity,再使用相同flag启动SingleTaskActivity

其运行日志如下:

[外链图片转存中…(img-TrXyz75N-1641132290930)]

图12 MainActivity使用FLAG_ACTIVITY_NEW_TASK启动MainActivity,再使用相同flag启动SingleTaskActivity

其运行日志如下:

Android - singleTask启动模式详解相关推荐

  1. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  2. Android系统(187)---最易懂的Activity启动模式详解

    Android基础:最易懂的Activity启动模式详解 前言 Android基础中,Activity的启动模式非常重要 本文将全面介绍 Activity的启动模式 目录 目录 1. 定义 即Acti ...

  3. Activity的启动模式详解

    Activity的启动模式详解 Activity有四种载入模式:standard(默认), singleTop, singleTask和 singleInstance. (1).standard(默认 ...

  4. android zygote启动流程,Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...

  5. Android启动模式详解

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

  6. Android Activity Launch Mode 启动模式详解

    简介 android:launchMode 属性能设置 Activity 对象启动时是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题. 它是 Androidmanifest.x ...

  7. Android中Activity启动模式详解

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

  8. Android Activity的4种启动模式详解(示例)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...

  9. Android App启动流程详解

    前言:在之前的文章中已经写了apk的打包流程.安装流程,今天就是梳理一下apk系列的最后的流程--app启动流程.经过今天的梳理以后咱们就可以对apk包是怎么编译生成的.apk是怎么被安装到安卓手机的 ...

  10. Activity的5种启动模式详解(新增singleInstancePerTask类型)

    前言 看到这个标题的时候,也许你会认为我写错了,Activity不是只有四种启动模式吗?分别为startard,singleTop,singleTask,singleInstance这四种. 一般来说 ...

最新文章

  1. JPush 使用教程
  2. JAVA学习篇--Servlet详解
  3. 使用React,Redux和Router进行真正的集成测试
  4. PMP读书笔记(第13章)
  5. mongo的php查询,使用PHP进行简单查询的mongo查询速度慢
  6. 视觉SLAM笔记(30) 特征点法
  7. TortoiseGit 自动登录
  8. 由a标签的onclick影出来的问题
  9. linux发邮件权限,Linux通过命令行发邮件的步骤
  10. 总结——达内视频(一)
  11. word 插入公式附加右侧编号方法
  12. deepin linux固态硬盘安装教程,如何安装深度deepin 国产Linux教程 主要操作如下
  13. python算法1加1_【Python爬虫作业】- 第一周01 笨方法0-10加分题
  14. Android /assets
  15. C语言写三阶矩阵的转置
  16. 安全杂记二(网络安全威胁)
  17. Java--敲重点!JDK1.8 HashMap特性及底层数组+单链表+红黑树知识(建议收藏)
  18. 如何伦敦银走势图中寻找波段操作机会
  19. 第一阶段冲刺团队贡献值分析
  20. 层次分析法java_层次分析法java实现

热门文章

  1. 如果找活跃IP段!抓肉鸡必须的!
  2. win7注册服务器错误代码,win7系统启动不了iis服务器出现错误代码怎么解决
  3. 5.4.1. Check Constraints
  4. 关于材料设计vector矢量图形
  5. newifi刷老毛子笔记
  6. Timesten Classic 18.1 建立缓存组
  7. redhat官方文档下载方法
  8. 图像列表控制(CImageList)
  9. 软件封装-单文件打包
  10. CSS美化超链接样式