返回

Android (9.0) Activity 启动流程 (二) : 深入解析

Android

Android 9.0 Activity 启动流程的第二部分,重点解析 ActivityThread.main() 方法、prepareMainLooper() 和 loop() 方法的作用,深入探索 ApplicationThread、Instrumentation 和 AppBindData 的相关内容。

Android 的冷启动流程:

  1. 启动Zygote进程。
  2. 创建应用进程。
  3. 创建并初始化Application对象。
  4. 启动ActivityThread。
  5. 执行ActivityThread的main方法。

这次我们进入ActivityThread.main() 方法中。

在ActivityThread.main()方法中,主要做了以下几件事:

  1. 初始化Looper。
  2. 创建并初始化Instrumentation对象。
  3. 创建Application对象。
  4. 调用Instrumentation对象的onCreate方法。
  5. 调用Application对象的onCreate方法。
  6. 启动主线程Looper。

Looper是什么?

Looper是一个消息循环,它不断地从消息队列中取出消息并处理。在Android中,主线程有一个Looper,它负责处理来自UI线程的所有消息。

Instrumentation是什么?

Instrumentation是一个接口,它允许我们控制和监视Android应用程序的执行。Instrumentation对象通常用于测试应用程序。

Application是什么?

Application是Android应用程序的主类,它负责管理应用程序的生命周期和全局状态。

接下来,我们进入prepareMainLooper() 方法中。

在prepareMainLooper()方法中,主要做了以下几件事:

  1. 创建主线程Looper。
  2. 创建并初始化主线程MessageQueue。
  3. 创建并初始化主线程Handler。

MessageQueue是什么?

MessageQueue是一个消息队列,它存储了所有需要处理的消息。

Handler是什么?

Handler是一个消息处理器,它负责从MessageQueue中取出消息并处理。

最后,我们进入loop()方法中。

在loop()方法中,主要做了以下几件事:

  1. 不断地从主线程MessageQueue中取出消息并处理。
  2. 当MessageQueue为空时,调用wait()方法等待新的消息。

这就是ActivityThread.main() 方法、prepareMainLooper() 方法和 loop() 方法的主要作用。

接下来,我们再来看看ApplicationThread、Instrumentation 和 AppBindData这三个类。

ApplicationThread是什么?

ApplicationThread是ActivityThread与应用程序之间通信的桥梁。应用程序通过ApplicationThread向ActivityThread发送消息,ActivityThread通过ApplicationThread向应用程序发送消息。

Instrumentation是什么?

Instrumentation是一个接口,它允许我们控制和监视Android应用程序的执行。Instrumentation对象通常用于测试应用程序。

AppBindData是什么?

AppBindData是一个数据结构,它存储了应用程序的绑定信息。当应用程序启动时,系统会创建一个AppBindData对象,并将它传递给ActivityThread。ActivityThread使用AppBindData对象来绑定应用程序的各个组件。