parent
95d2456cec
commit
8196292314
@ -0,0 +1,203 @@ |
||||
--- |
||||
说说 Activity 的启动流程 |
||||
--- |
||||
|
||||
1. 启动 Activity 会经历哪些生命周期回调 |
||||
2. 冷启动大致流程,涉及哪些组件,通信过程是怎么样的? |
||||
3. Activity 启动过程中,生命周期回调的原理? |
||||
|
||||
#### 启动流程 |
||||
|
||||
```java |
||||
startActivity -> |
||||
ActivityManagerNative.getDefault().startActivity -> |
||||
mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0); |
||||
|
||||
@Override |
||||
public boolean onTransact(int code, Parcel data, Parcel reply, int flags) { |
||||
switch(code) { |
||||
case START_ACTIVITY_TRANSACTION: { |
||||
startActivity(app, callingPackage, intent, ...); |
||||
} |
||||
} |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
// AMS |
||||
void startSpecialActivityLocked(ActivityRecord r, ...) { |
||||
// 查询组件对应的进程是否已经启动 |
||||
ProcessRecord app = mService.getProcessRecordLocked(r.processName, ...); |
||||
if(app!=null&&app.thread!=null){ |
||||
realStartActivity(r, app, ...); |
||||
return; |
||||
} |
||||
// 启动进程 |
||||
mService.startProcessLocked(r.processName, ...); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
private final void startProcessLocked(ProcessRecord app) { |
||||
// 进程启动完成后,执行的入口函数的 Java 类 |
||||
if(entryPoint == null) entryPoint = "android.app.ActivityThread"; |
||||
Process.ProcessStartResult startResult = Process.start(entryPoint, ); |
||||
|
||||
synchronized(mPidsSelfLocked) { |
||||
mPidsSelfLocked.put(startResult.pid, app); |
||||
Message msg = mHandle.obtainMessage(PROC_START_TIMEOUT_MSG); |
||||
msg.obj = app; |
||||
mHandle.sendMessageDelayed(msg, PROC_START_TIMEOUT); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
public static final ProcessStartResult start(final String processClass, ){ |
||||
return startViaZygote(processClass,); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
ProcessStartResult startViaZygote(final String processClass, ){ |
||||
return zygoteSendArgsAndGetResult( |
||||
openZygoteSocketIfNeeded(abi), argsForZygote); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
boolean runOnce() { |
||||
// 读取 Zygote 发送过来的参数列表 |
||||
String[] args = readArgumentList(); |
||||
// 创建应用进程 |
||||
int pid = Zygote.forkAndSpecialize(...); |
||||
if(pid == 0) { |
||||
// 子进程,执行 ActivityThread#main 函数 |
||||
handleChildProc(...); |
||||
return true; |
||||
} else { |
||||
// 父进程把 pid 通过 Socket 在写回去 |
||||
return handlePArentProc(pid, ...); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
// ActivityThread |
||||
public static void main(String[] args) { |
||||
Looper.prepareMainLooper(); |
||||
|
||||
ActivityThread thread = new ActivityThread(); |
||||
thread.attach(false); |
||||
|
||||
Looper.loop(); |
||||
|
||||
throw new RuntimeException(""); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
private void attach(boolean system) { |
||||
IActivityManager mgr = ActivityManagerNative.getDefault(); |
||||
mgr.attachApplication(mAppThread); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
boolean attachApplicationLocked(IApplicationThread thread, ...) { |
||||
ProcessRecord app = mPidsSelfLocked.get(pid); |
||||
// IPC 调用,回到应用进程 |
||||
thread.bindApplication(...); |
||||
// 以下处理挂起的应用组件 |
||||
mStackSupervisor.attachApplicationLocked(app); |
||||
mServices.attachApplicationLocked(app, processName); |
||||
sendPendingBroadcastsLocked(app); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
boolean attachApplicationLocked(ProcessRecord app) { |
||||
// stack: mFocusedStack, |
||||
ActivityRecord hr = stack.topRunningActivityLocked(null); |
||||
realStartActivityLocked(hr, app, true, true); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
final boolean realStartActivityLocked(ActivityRecord r, ) { |
||||
// ProcessRecord.ApplicationThread.scheduleLaunchActivity |
||||
app.thread.scheduleLaunchActivity(new Intent(r.intent), ...); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
@Override |
||||
public final void scheduleLaunchActivity(Intent intent, IBinder token, ){ |
||||
ActivityClientRecord r = new ActivityClientRecord(); |
||||
// mH,sendMessage,丢到主线程的 Handler |
||||
sendMessage(H.LAUNCH_ACTIVITY, r); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
// 主线程处理 |
||||
final ActivityClientRecord r = (ActivityClientRecord)msg.obj; |
||||
// 生成 LoadedApk 对象 |
||||
r.packageInfo = getPackageInfoNoCheck(...); |
||||
handleLaunchActivity(r, null); |
||||
``` |
||||
|
||||
```java |
||||
private void handleLaunchActivity(ActivityClientRecord r, ...) { |
||||
Activity a = performLaunchActivity(r, customIntent); |
||||
if(a!=null) { |
||||
handleResumeActivity(r.token, false, ...); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
private Activity performLaunchActivity(ActivityClientRecord r, ...) { |
||||
Activity activity = mInstrumentation.newActivity(...); |
||||
Application app = r.packageInfo.makeApplication(false, mInstrumentation); |
||||
Context appContext = createBaseContextForActivity(r, activity); |
||||
// activity.attach |
||||
activity.attach(appContext, ...); |
||||
// activity.onCreate |
||||
mInstrumentation.callActivityOnCreate(activity, r.state); |
||||
// activity.onStart |
||||
activity.performStart(); |
||||
return activity; |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
final void handleResumeActivity(IBinder token) { |
||||
ActivityClientRecord r = performResumeActivity(...); |
||||
//... |
||||
} |
||||
``` |
||||
|
||||
**总结** |
||||
|
||||
1. 创建 Activity 对象 |
||||
|
||||
首先通过 ClassLoder 加载 LoadedApk 里的类生成 Activity 对象 |
||||
|
||||
2. 准备好 Application |
||||
|
||||
Application 在应用进程启动时就已经创建好了,这一步直接拿即可 |
||||
|
||||
3. 创建 ContextImpl |
||||
|
||||
4. attach 上下文 |
||||
|
||||
5. 生命周期回调 |
||||
|
||||
![Activity 启动流程](/Users/omooo/Downloads/Activity 启动流程.png) |
||||
|
||||
#### 说说 Activity 的启动流程 |
||||
|
||||
1. 启动 Activity 要向 AMS 发起 binder 调用 |
||||
2. Activity 所在进程是怎么启动的? |
||||
3. 应用 Activity 的生命周期回调原理 |
Loading…
Reference in new issue