Android - singleTask启动模式详解(1)

文章详细描述了Android中SingleTaskActivity的启动机制,包括默认启动、任务栈重用、新任务栈创建以及FLAG_ACTIVITY_NEW_TASK标志的影响。它着重于活动实例在不同情况下的创建、销毁和onNewIntent方法的调用过程。
摘要由CSDN通过智能技术生成

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

其运行日志如下:

2021-04-05 23:14:14.898 32604-32604/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43245
2021-04-05 23:14:20.161 32604-32604/com.example.myfirstapp I/System.out: MainActivity start in FLAG_ACTIVITY_NEW_TASK
2021-04-05 23:14:20.238 32604-32604/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43245
2021-04-05 23:14:20.656 32604-32604/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43245
2021-04-05 23:14:26.439 32604-32604/com.example.myfirstapp I/System.out: SingleTaskActivity start in FLAG_ACTIVITY_NEW_TASK
2021-04-05 23:14:26.533 32604-32604/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 43245
2021-04-05 23:14:26.950 32604-32604/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43245

如果在其他任务栈中启动使用FLAT_ACTIVITY_NEW_TASK启动MainActivity,且系统中不存在系统默认栈,则系统会创建一个任务栈,并在该任务栈中创建MainActivity的实例对象,此时在新建栈中使用FLAT_ACTIVITY_NEW_TASK启动SingleTaskAffinityActivity,系统将在当前任务栈创建SingleTaskAffinityActivity的实例对象。其调用流程如图13所示:

singleTask_10.png ​ 图13 其他任务栈启动MainActivity后由MainActivity启动SingleTaskActivity

其运行日志如下:

2021-04-06 21:22:02.796 28516-28516/com.example.myfirstapp I/System.out: SingleTaskAffinityActivity Create. Task Id: 43340
2021-04-06 21:22:12.875 28516-28516/com.example.myfirstapp I/System.out: MainActivity start in FLAG_ACTIVITY_NEW_TASK
2021-04-06 21:22:12.972 28516-28516/com.example.myfirstapp I/System.out: MainActivity Create. Task Id: 43341
2021-04-06 21:22:13.471 28516-28516/com.example.myfirstapp I/System.out: SingleTaskAffinity Stop. Task Id: 43340
2021-04-06 21:22:27.561 28516-28516/com.example.myfirstapp I/System.out: SingleTaskActivity start in FLAG_ACTIVITY_NEW_TASK
2021-04-06 21:22:27.639 28516-28516/com.example.myfirstapp I/System.out: SingleTaskActivity Create. Task Id: 43341
2021-04-06 21:22:28.053 28516-28516/com.example.myfirstapp I/System.out: MainActivity Stop. Task Id: 43341

如果默认任务栈中已存在MainActivitySingleTaskActivity的实例对象,此时由SingleTaskActivity使用FLAG_ACTIVITY_NEW_TASK启动MainActivity,由于其从属于当前任务栈,因此系统在默认任务栈创建一个新的MainActivity的实例对象,此时由新的MainActivity实例对象使用FLAG_ACTIVITY_NEW_TASK启动SingleTaskActivity,由于当前任务栈中已经存在SingleTaskActivity的实例对象,因此系统调用该实例对象的onNewIntent()方法,并销毁其上所有实例对象。其调用流程如图14所示:

文末

初级工程师拿到需求会直接开始做,然后做着做着发现有问题了,要么技术实现不了,要么逻辑有问题。

而高级工程师拿到需求会考虑很多,技术的可行性?对现有业务有没有帮助?对现有技术架构的影响?扩展性如何?等等…之后才会再进行设计编码阶段。

而现在随着跨平台开发,混合式开发,前端开发之类的热门,Android开发者需要学习和掌握的技术也在不断的增加。

通过和一些行业里的朋友交流讨论,以及参考现在大厂面试的要求。我们花了差不多一个月时间整理出了这份Android高级工程师需要掌握的所有知识体系。你可以看下掌握了多少。

混合式开发,微信小程序。都是得学会并且熟练的

这些是Android相关技术的内核,还有Java进阶

高级进阶必备的一些技术。像移动开发架构项目实战等

Android前沿技术;包括了组件化,热升级和热修复,以及各种架构跟框架的详细技术体系

以上即是我们整理的Android高级工程师需要掌握的技术体系了。可能很多朋友觉得很多技术自己都会了,只是一些新的技术不清楚而已。应该没什么太大的问题。

而这恰恰是问题所在!为什么别人高级工程师能年限突破30万,而你只有十几万呢?

就因为你只需补充你自己认为需要的,但并不知道企业需要的。这个就特别容易造成差距。因为你的技术体系并不系统,是零碎的,散乱的。那么你凭什么突破30万年薪呢?

我这些话比较直接,可能会戳到一些人的玻璃心,但是我知道肯定会对一些人起到点醒的效果的。而但凡只要有人因为我的这份高级系统大纲以及这些话找到了方向,并且付出行动去提升自我,为了成功变得更加努力。那么我做的这些就都有了意义。

喜欢的话请帮忙转发点赞一下能让更多有需要的人看到吧。谢谢!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
起到点醒的效果的。而但凡只要有人因为我的这份高级系统大纲以及这些话找到了方向,并且付出行动去提升自我,为了成功变得更加努力。那么我做的这些就都有了意义。

喜欢的话请帮忙转发点赞一下能让更多有需要的人看到吧。谢谢!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值