Activity 的启动流程总结

123 阅读1分钟

本文总结自慕课网风语老师的Framwork的课程.

首先看三个问题:

1.启动Activity会经历哪些生命周期

2.冷启动大致流程,涉及哪些组件,通信过程是怎么样的

3.Activity启动过程中,生命周期回调原理

直接从我们最熟悉的startActivity看起

startActivity.png

从startActivity开始,发起请求

mRemote.transact方法就是将请求封装起来,传递到binder,binder再转发到AMS

AMS收到onTransact的回调,onTransact通过请求码code,处理请求startActivity

(此Activity是AMS的函数,具体实现:)

ProcessRecord app = mService.getProcessRecprdLocked(r.processName..).png 1.首先查询Activity对应的进程是否启动,并且注册过自己的ApplicationThread

2.如果满足直接调用realStratActivityLocked函数,启动Activity

3.如果不满足需要先启动Activity所在的进程,再回过头启动Activity(也是调用realStratActivityLocked函数)

private finalvoid startProck.png

1.启动进程,并传递入口函数所在的类

2.向map中添加进程记录

3.发送一个延迟消息,应用进程启动后超时一定时间(10s)没有向AMS报告,AMS清理应用的所有信息

Hpublic static final ProcessStartResult star (final String processClass)(.png

ProcessStartResults.png

1.打开socket,

2.通过sokect向zygote发送消息并获取返回结果

boolean runOnceo(.png

zygote的处理:

1.读取参数

2.fork进程

3.分别处理父进程和子进程

ActivityThread的入口函数

static void main (Stringl args) (.png

1.开启looper

2.向AMS报告

Hprivate void.png

小结:

Zygote.png

1 boolean att.png

1.thread.bindApplication,进行初始化

2.处理挂起的应用组件(因为之前启动的时候,进程没有启动)

boolean attachApplicationLocked(ProcessRecord app) (.png mFocusedStack非Launcher进程的栈

! final boolean rea.png

1.封装一个ActivityClientRecord

2.发送一个Message

final ActivityClientRecord r = (ActivityClientRecord) msg.obj;.png

performLaunchActivity

private Activity erformLaunchActivity (ActivityClientRecord r...){.png

handleResumeActivity

final void handleResumeActivity(IBinder token, ){.png

小结应用端启动Activity步骤:

创建Activity对象.png

涉及到的各个进程:

Zygote1.png

总结:

1.启动Activity要向AMS发起binder调用

2.Activity所在的进程是怎么启动的

3.应用Activity生命周期回调