Update Activity 组件的启动过程.md

master
Omooo 5 years ago
parent 0d539ed26f
commit 5d7ffee0e9
  1. 50
      blogs/Android/Framework/源代码情景分析/Activity 组件的启动过程.md

@ -362,3 +362,53 @@ public final class ActivityThread {
1. 在进程中创建一个 ActivityThread 对象,并且调用 attach 函数向 AMS 发送一个启动完成通知 1. 在进程中创建一个 ActivityThread 对象,并且调用 attach 函数向 AMS 发送一个启动完成通知
2. 创建一个消息循环 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
Loading…
Cancel
Save