写点什么

Android - singleTask 启动模式详解,腾讯 Android 面试

用户头像
Android架构
关注
发布于: 刚刚

如果当前栈中存在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: 431122021-04-04 22:45:14.365 17626-17626/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 431122021-04-04 22:45:14.803 17626-17626/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 431122021-04-04 22:45:27.204 17626-17626/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 431122021-04-04 22:45:27.614 17626-17626/com.example.myfirstapp I/System.out: SingleTaskActivity Stop. Task Id: 431122021-04-04 22:45:32.225 17626-17626/com.example.myfirstapp I/System.out: SingleTaskActivity onNewIntent. Task Id: 431122021-04-04 22:45:32.620 17626-17626/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 431122021-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: 431132021-04-04 22:46:10.912 19083-19083/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 431142021-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: 431132021-04-04 22:46:10.912 19083-19083/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 431142021-04-04 22:46:11.427 19083-19083/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 431132021-04-04 22:46:33.892 19083-19083/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 431142021-04-04 22:46:34.304 19083-19083/com.example.myfirstapp I/System.out: SingleTaskAffinity Stop. Task Id: 431142021-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: 431142021-04-04 22:46:53.999 19083-19083/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity onNewIntent. Task Id: 431142021-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: 432262021-04-05 22:04:46.692 32718-32718/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 432272021-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: 432262021-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: 432282021-04-05 22:17:28.142 13497-13497/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 432282021-04-05 22:17:28.564 13497-13497/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 432282021-04-05 22:17:29.455 13497-13497/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 432282021-04-05 22:17:29.865 13497-13497/com.example.myfirstapp I/System.out: SingleTaskActivity Stop. Task Id: 432282021-04-05 22:17:38.971 13497-13497/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 432292021-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: 432282021-04-05 22:18:01.975 13497-13497/com.example.myfirstapp I/System.out: SingleTaskActivity onNewIntent. Task Id: 432282021-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: 432332021-04-05 22:24:24.994 23571-23571/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 432342021-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


其运行日志如下:


2021-04-05 23:14:14.898 32604-32604/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 432452021-04-05 23:14:20.161 32604-32604/com.example.myfirstapp I/System.out: MainActivity start in FLAG_ACTIVITY_NEW_TASK2021-04-05 23:14:20.238 32604-32604/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 432452021-04-05 23:14:20.656 32604-32604/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 432452021-04-05 23:14:26.439 32604-32604/com.example.my


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


firstapp I/System.out: SingleTaskActivity start in FLAG_ACTIVITY_NEW_TASK2021-04-05 23:14:26.533 32604-32604/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 43245

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android - singleTask启动模式详解,腾讯Android面试