参考文章:
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- 一个APP从启动到主页面显示经历了哪些过程
- 跟面试官讲Binder
- 图解Android系统的启动过程
- 3分钟看懂Activity启动流程
- Android:图解Activity启动流程源码(整体流程)
- 全栈级别梳理-Android系统启动流程
- Android系统开篇(强推已经无法表达我的景仰之情,那我就来个超级强推”,真的超赞)
- Android系统篇之----解读AMS远端服务调用机制以及Activity的启动流程 (这篇也很良心,推荐阅读)
开始前的啰嗦
Activity的启动流程看了很久,今天终于看懂了。其实,要清晰整个流程,重点在于:
- 要把Activity的启动流程跟系统架构图联系起来,这样明白Activity启动流程中跨进程通信的含义,也才能明白谷歌设计的原因。
- 清晰各个类的作用,他们在架构图中所处的层级,以及在通信中分别处于哪一端(服务端还是客户端)。因为在Activity启动流程中涉及两次Binder通信,这也是第一次看代码时容易懵逼的原因。(反正我是懵逼了~~~)
- 最后,多画图,多总结。
正式开始。
步骤一:认识Android架构
先阅读Android系统开篇,要对整个Android体系有个了解,才能继续。下面这张图是来自上面的文章,只不过我加了点注释。
步骤二:熟悉Binder通信
详细请阅读:Binder + AMS + ADIL大杂烩里面推荐的文章 看完之后,看下面一张图,巩固一下自己的了解:
步骤三:初略过一遍代码,大概缕清流程
这一阶段请参考文章 Android系统篇之----解读AMS远端服务调用机制以及Activity的启动流程,里面注释的很清楚。
步骤四:画张图,自己整理一下思路
- AMS: ActivityManagerService
- ASS: ActivityStackSupervisor
- AMN : ActivityManagerNative
- AMP : ActivityManagerProxy
到这里,Activity启动的学习之旅大致就结束了。。。终于把自己多年前埋下的坑填了。 文章中很多都是分享大神博客的链接。作为渣渣一枚,我也没有造轮子的打算,只是单纯分享一下自己在学习中看到的好的博客,让大家找资料的时候方便一点。
补充知识
Activity的启动模式
四种:
- standard : 每次都新建一个实例
- singleTop:栈顶如果有该Activity的实例,重用
如果栈顶有一个相同类型的Activity实例的话,将不会创建新的,而是会通过调用**onNewIntent()**方法将intent发送到这个已经存在的Activity实例中。so,使用 singleTop 模式时,你必须同时在 onCreate() 和 onNewIntent() 方法中接受处理发送而来的 Intent 数据,以应对所有使用场景。
使用常见:搜索界面。通常我们会在搜索结果页面也放置一个搜索框,使用户在不需要按返回键的情况下搜索其他关键字。此时,为了不每次都新建一个搜索结果页面,我们会将搜索结果页面设置为
singleTop
,每次更新搜索关键字时,我们发送一个 Intent 到已经存在的 Activity 实例并让它更新搜索结果。 此时的生命周期:
- Activity.onPause
- Activity.onNewIntent
- Activity.onRestart
- Activity.onStart
- Activity.onResume
- singleTask:栈内如果有该Activity的实例,重用(有点像单例)
如果系统中已经有一个 Activity 实例的话,拥有该实例的 Task 将被移到顶部,并且 Intent 将通过 onNewIntent() 方法传递过来。 but,**但是根据实际经验,它并不是像描述这样工作的。**根据 dumpsys activity 命令展示的结果,singleTask Activity 被放入调用者 Task 的栈顶。 如果你希望让 singleTask Activity 表现得像官方描述那样:创建一个新的 Task 并作为根 Activity 放置,你需要像下面这样额外指派 taskAffinity 属性给这个 Activity。
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask"
android:taskAffinity="">
复制代码
- singleInstance:应用间,进程间或线程间有该Activity的实例,重用(系统中只存在一个 Activity 实例)