Apk程序的运行过程
./frameworks/base/core/java/android/app/ActivityThread.java
public static final void main(String[] args) { SamplingProfilerIntegration.start(); Process.setArgV0("<pre-initialized>"); Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false); Looper.loop(); if (Process.supportsProcesses()) { throw new RuntimeException("Main thread loop unexpectedly exited"); } thread.detach(); String name = (thread.mInitialApplication != null) ? thread.mInitialApplication.getPackageName() : "<unknown>"; Log.i(TAG, "Main thread of " + name + " is now exiting"); }
1、ActivityThread从 main() 方法开始执行,调用 Looper.prepareMainLooper() 方法为UI线程创建一个消息队列(MessageQueue)
2、new ActivityThread() ,创建 ActivityThread 对象,在ActivityThread的初始化中创建一个 H(Handler) 对象和一个 ApplicationThread(Binder) 对象。
final ApplicationThread mAppThread = new ApplicationThread();
final H mH = new H();
1)Binder负责接收远程 AmS 的 IPC 调用
2)接收到的调用通过 Handler 把消息发送到消息队列,UI主线程异步地从消息队列中取出消息并执行相应操作,比如 start、stop、pause等。
3、UI主线程调用 Looper.loop() 方法进入消息循环体,不断地从消息队列中读取并处理消息
当 ActivityThread 接收到 AmS 发送 start 某个 Activity 后,就会创建指定的 Activity 对象, Activity 又会创建 PhoneWindow 类——> DecorView 类——>创建相应的 View 或者 ViewGroup 。创建完成后,Activity 需要把创建好的界面显示到屏幕上,于是调用 WindowManager 类,后者于是创建一个 ViewRoot 对象,该对象实际上创建了 ViewRoot 类和 W 类,创建 ViewRoot 对象以后, WindowManager 再调用 WmS 提供的远程调用接口完成添加一个窗口并显示到屏幕上。
4、等待用户在程序界面上操作,KeyQ 线程不多把用户消息存储到 QueueEvent 队列中,InputDispatcherThread 线程逐个取出消息,然后调用 WmS 中的相关函数处理该消息,当 WmS 发现该消息属于客户端某个窗口时,就会调用相应的窗口 W 接口。
W 类是一个 Binder,负责接收 WmS 的IPC调用,并把调用消息传递给 ViewRoot, ViewRoot 再把消息传递给 UI 主线程 ActivityThread,ActivityThread 解析该消息并作相应的处理,在客户端程序中,首先处理消息的是 DecorView,如果 DecorView 不想处理该消息,则可以把该消息传递给其内部包含的子 View 或者 ViewGroup ,如果还没有处理,则传递给 PhoneWindow ,最后在传递给 Activity