该系列只记录阅读代码时遇到的问题和心得体会,具体代码讲解可以参考老罗的《Android系统源代码情景分析》,我就不班门弄斧了。我编译的AOSP版本:6.0.1_r50。
代码摘抄
两个版本的Launcher
目前版本已经从Launcher2(packages/apps/Launcher2/src/com/android/launcher2)进化为Launcher3(packages/apps/Launcher3/src/com/android/launcher3)。两个版本的Launcher有着一定的差异,老罗书中以Launcher2为出发点。
packages/apps/Launcher2/src/com/android/launcher2/Launcher.java:
packages/apps/Launcher3/src/com/android/launcher3/Launcher.java:
Android的Singleton模式的实现
在frameworks/base/core/java/android/app/ActivityManagerNative.java中IActivityManager
是一个单利模式,所以Android实现了一个很标准的Singleton。在老罗版本里,没有使用这个类。
framework/base/core/java/android/util/Singleton.java:
ActivityManagerService
显然,AcitivityManagerService的位置由frameworks/base/services/java/com/android/service/am/ActivityManagerService.java
转移至frameworks/base/services/core/java/com/android/service/am/ActivityManagerService.java
。同时startActivity
函数也有所改变:
frameworks/base/services/core/java/com/android/service/am/ActivityManagerService.java:
主要的变化是添加了用户的概念,同时加入了mStackSupervisor(ActivityStackSuperVisor)来管理ActivityStack。
根Activity启动过程
下面将用顺序图来展示根Activity是如何从桌面启动的。
Step1. Launcher启动一个APP
当用户点击某一个应用图标,意味着需要启动一个应用的根Activity。Launcher也是一个应用,和普通应用启动Activity过程类似。这里展示了在Launcher中的进行的步骤,最后通过Binder与ActivityMangerService进行进程间通信,告知它来启动Activity。
Step2. ActivityMangerService进行准备工作
这里主要工作就行将需要启动的Activity放置于栈顶,等待启动。在启动新Activity前,需要将旧的Activity先停止下来。
Step3. 旧Activity停止
在这里,需要停止的Activity就是Launcher的Activity。在完成停止的过程后,需要告知ActivityMangerService。
Step4. ActivityMangerService继续准备
这里会发现该Activity还没有进程可以运行,所以需要先启动一个新的ActvityThread进程。
Step5. ActivityThread进程启动
等进程启动完毕后,同样需要ActivityMangerService,以便它将等待该进程的Activity启动起来。
Step6. ActivityMangerService继续启动
这里会将等待该进程的Activity和Service启动起来。
Step7. 新Activity启动
到这里,启动过程结束