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
,系统会调用SingleTaskAffinityActivity
的onNewIntent()
方法并销毁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所示:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司21年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
详细整理在GitHub可以见;
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
oid架构视频+BAT面试专题PDF+学习笔记](https://bbs.csdn.net/topics/618156601)**
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。