Android – singleTask启动模式详解

Android – singleTask启动模式详解其运行日志如下:2021-04-0422:45:03.65017626-17626/com.example.myfirstappI/System.out:MainActivityCreate.TaskId:431122021-04-0422:45:14.36517626-17626/com.example.myfirstappI/System.out:SingleTaskActivityCreate.TaskId:431122021-04-0422:45:14.803

大家好,又见面了,我是你们的朋友全栈君。

其运行日志如下:

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所示:

singleTask_3.png

图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所示:

singleTask_1.png

图5 应用启动默认任务栈

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

singleTask_4.png

图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所示:

singleTask_5.png

图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所示:

singleTask_6.png

图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所示:

singleTask_7.png

图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所示:

singleTask_8.png

图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所示:

singleTask_1.png

图11 应用启动默认任务栈

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

singleTask_9.png

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

其运行日志如下:

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

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

其运行日志如下:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153275.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python如何读取sql文件_sql数据库常用命令

    python如何读取sql文件_sql数据库常用命令基本思路:①读sql文件,整理出sql语句;②执行sql语句。简单代码如下:#db_cursor→由db_cursor()创建,sql_file→sql文件defread_SQL(self,db_cursor,sql_file):#打开文件fpfp=open(sql_file,encoding=’utf8′)#读文件file=fp.readlines()#sql语句集合(

    2022年10月2日
    0
  • 21位数激活码生成[最新免费获取]「建议收藏」

    (21位数激活码生成)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月1日
    127
  • 狂神说Vue笔记整理「建议收藏」

    狂神说Vue笔记整理「建议收藏」狂神说Vue笔记​ 想要成为真正的“互联网Java全栈工程师”还有很长的一段路要走,其中前端是绕不开的一门必修课。本阶段课程的主要目的就是带领Java后台程序员认识前端、了解前端、掌握前端,为实现成为“互联网Java全栈工程师”再向前迈进一步。一、前端核心分析1.1、概述Soc原则:关注点分离原则Vue的核心库只关注视图层,方便与第三方库或既有项目整合。HTML+CSS+JS:视图:给用户看,刷新后台给的数据网络通信:axios页面跳转:vue-router状态管

    2022年6月3日
    71
  • 深圳外包公司名单

    深圳外包公司名单深圳外包公司名单

    2022年5月31日
    100
  • docker拷贝目录到容器_docker退出容器命令

    docker拷贝目录到容器_docker退出容器命令现在公司用docker,有时候需要从容器中拷贝文件出来。先上语法:dockercp[OPTIONS][CONTAINER_ID]:[SRC_PATH][DEST_PATH]语法是这么个写法,在实际的操作中,在写容器内的路径的时候并不能自动补全,所以实际上还需要还要先进入到容器才行。下面就拿个实例来讲下:1.在服务器上用有权限的用户,执行dockerps查看全部容…

    2022年8月20日
    5
  • PAL制式和NTSC制式的区别「建议收藏」

    PAL制式和NTSC制式的区别「建议收藏」常见的电视信号制式是PAL和NTSC,另外还有SECAM等。NTSC即正交平衡调幅制。PAL为逐行倒像正交平衡调幅制。什么是PAL制式呢?什么是NTSC制式?简单的说,NTSC和PAL属于全球两大

    2022年8月1日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号