diff --git a/blogs/Android/Framework/源代码情景分析/Activity 组件的启动过程.md b/blogs/Android/Framework/源代码情景分析/Activity 组件的启动过程.md index 50e90dd..40067d9 100644 --- a/blogs/Android/Framework/源代码情景分析/Activity 组件的启动过程.md +++ b/blogs/Android/Framework/源代码情景分析/Activity 组件的启动过程.md @@ -362,3 +362,53 @@ public final class ActivityThread { 1. 在进程中创建一个 ActivityThread 对象,并且调用 attach 函数向 AMS 发送一个启动完成通知 2. 创建一个消息循环 +我们主要关心新的应用程序进程是如何向 AMS 发送一个启动完成通知的。 + +在创建 ActivityThread 对象 thread 时,会同时在它内部创建一个 ApplicationThread 对象 mAppThread。前面提到,ApplicationThread 对象是一个 Binder 本地对象,AMS 就是通过它来和应用程序进程通信的。 + +在 ActivityThread 类的成员函数 attach 中,首先调用 ActivityManagerNative 类的静态成员函数 getDefault 来获得 AMS 的一个代理对象;然后调用它的成员函数 attachApplication 向 AMS 发送一个进程间通信请求,并且将前面所创建的 ApplicationThread 对象传递给 AMS。 + +AMS 代理对象的类型为 ActivityManagerProxy: + +```java +class ActivityManagerProxy implements IActivityManager { + public void attachApplication(IApplicationThread app) { + Parcel data = Parcel.obtain(); + data.writeStrongBinder(app.asBinder()); + mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, ...); + } +} +``` + +以上是在新的应用程序进程中执行的,也就是通过 AMP 向 AMS 发送一个 ATTACH_APPLICATION_TRANSACTION 的进程间通信请求。 + +```java +// AMS +public final void attachApplication(IApplicationThread thread) { + attachApplicationLocked(thread); +} +``` + +AMS 类的成员函数 attachApplication 接收到新的应用程序进程发送过来的类型为 ATTACH_APPLICATION_TRANSACTION 的进程间通信请求之后,它就知道新的应用程序进程已经启动完成了。因此,接下来就是调用 attachApplicationLocked 来继续执行启动 MainActivity 组件的操作。 + +```java +// AMS +private final boolean attachApplicationLocked(IApplicationThread thread, int pid) { + ProcessRecord app; + app.thread = thread; + ActivityRecord hr = mMainStack.topRunningActivityLocked(null); + mMainStack.realStartActivityLocked(hr, app, true, true); +} +``` + +现在得到的这个 ProcessRecord 就是用来描述新创建的应用进程,然后拿位于 Activity 组件堆栈顶端的一个 ActivityRecord 对象 hr,与它对应的 Activity 组件就是即将要启动的 MainActivity 组件,然后调用 realStartActivityLocked 来请求启动 MainActivity 组件。 + +```java +// ActivityStack +final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, ...) { + r.app = app; + app.thread.scheduleLaunchActivity(new Intent(r.intent), ...); +} +``` + +参数 app 的成员变量 thread \ No newline at end of file