Android (9.0) Activity 启动流程 (二) : 深入解析
2023-09-16 01:36:01
Android 9.0 Activity 启动流程的第二部分,重点解析 ActivityThread.main() 方法、prepareMainLooper() 和 loop() 方法的作用,深入探索 ApplicationThread、Instrumentation 和 AppBindData 的相关内容。
Android 的冷启动流程:
- 启动Zygote进程。
- 创建应用进程。
- 创建并初始化Application对象。
- 启动ActivityThread。
- 执行ActivityThread的main方法。
这次我们进入ActivityThread.main() 方法中。
在ActivityThread.main()方法中,主要做了以下几件事:
- 初始化Looper。
- 创建并初始化Instrumentation对象。
- 创建Application对象。
- 调用Instrumentation对象的onCreate方法。
- 调用Application对象的onCreate方法。
- 启动主线程Looper。
Looper是什么?
Looper是一个消息循环,它不断地从消息队列中取出消息并处理。在Android中,主线程有一个Looper,它负责处理来自UI线程的所有消息。
Instrumentation是什么?
Instrumentation是一个接口,它允许我们控制和监视Android应用程序的执行。Instrumentation对象通常用于测试应用程序。
Application是什么?
Application是Android应用程序的主类,它负责管理应用程序的生命周期和全局状态。
接下来,我们进入prepareMainLooper() 方法中。
在prepareMainLooper()方法中,主要做了以下几件事:
- 创建主线程Looper。
- 创建并初始化主线程MessageQueue。
- 创建并初始化主线程Handler。
MessageQueue是什么?
MessageQueue是一个消息队列,它存储了所有需要处理的消息。
Handler是什么?
Handler是一个消息处理器,它负责从MessageQueue中取出消息并处理。
最后,我们进入loop()方法中。
在loop()方法中,主要做了以下几件事:
- 不断地从主线程MessageQueue中取出消息并处理。
- 当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对象来绑定应用程序的各个组件。