From 5d7ffee0e9991d84cb948e4385f7eacbdaac8934 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Wed, 20 May 2020 11:28:14 +0800 Subject: [PATCH] =?UTF-8?q?Update=20Activity=20=E7=BB=84=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=BF=87=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Activity 组件的启动过程.md | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) 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