Android Activity桌面冷启动的9.0源码流程

ActvityRecord创建时机,Pause后台Activity时机,开屏动画是否是Activity的Window, ActvityRecord 加入到Task和Stack的时机,进程启动后如何继续之前的Activity操作

1启动时序

1.1 App端启动:

所有context的实现都是来自 ContextImpl 一般来说都是使用一个ContextWrapper 来包裹 ContextImpl

ContextImpl.java:

Instrumentation.java:

上述函数中token表示启动者的token,可能会用于接收activittyResult,当调用方法为startActivityForReuslt时

contextImpl.java

broadcastIntent 最终调用的IActivityTaskManager 的binder接口

private final ApplicationContentResolver mContentResolver;

然后可以通过ApplicationContentResolver 调用ActivityThread 里的方法来得到Binder代理对象

其中IContentProvider 是一个binder接口包含了获取路径如下

ActivityThread.java:

最终调用到IActivityManager 里的getContentProvider接口

至此四大组件启动端的重要流程以及看完,接下来看ams中的流程

2.在ams中的处理流程

ActivityManagerService 是四大组件的核心管理类,也是进程启动的管理类

从上一节的binder调用,实现为

ActivityManagerService.java

caller 为调用者的IApplicationThread 的代理实现resultTo 对应启动时候的启动者的binder

ActivityManagerService.java

ActivityStartController.java

这个类是用来独立处理activity启动的一个代理类用于activity的启动代理

构造方法如下

这个类根据一个mFactory 构造出ActivityStarter,用来填充参数进行启动,在它的execute方法中执行

其中maywait为false的启动方式似乎只有context.startNextMatchingActivity

ActivityStarter.java

这个方法里面主要做了解析ActivityInfo 更新全局数据等操作,然后继续调用到了当前类的startActivity 内容如下

ActivityStarter.java

ActivityStarter.startActivity这一步主要是创建了ActivityRecord 以及做了一些启动前的判断和启动拦截,在方法末尾调用了startActivityUnchecked,内容如下

ActivityStarter.java

ActivityStarter.startActivityUnChecked这里主要进行了 ActivityRecord 启动判断,如果是单例之类的启动,可以复用的话,则复用 Activityrecord ,Activityrecord放到Taskrecord,以及把 TaskRecrod放到stack的操作也在这里,总的来说就是为启动activity做taskRecord 和ActivityRecord和 ActivityStack的准备

ActivityStackSupervisor.java

这里主要就是调了ActivityTack.resumeTopActivityUncheckedLocked

ActivityTack.java

这里没什么好说,就是调用resumeTopActivityInnerLocked 其次就是根据mStackSupervisor.inResumeTopActivity判断是否已经在进行 resumeTopActivityInnerLocked 操作

ActivityStack.java

ActivityStack.resumeTopActivityInnerLocked,进行了进程判断,pasue后台activity等,过场动画准备

StackSupervisor.java

待续。。。