APK启动过程概述
一.apk其实是一个Java程序,所有必须从main函数开始执行。而apk应用的main函数所在的类就是ActivityThread,其main函数就是程序的启动点。apk启动后会马上开启一个消息循环,即通过调用Looper的prepareMainLooper(),创建消息队列。然后创建ActivityThread对象,在这里会创建一个Handler对象(H)用于从消息队列里取出消息并处理,要注意的是,这个消息处理过程是一个异步处理的过程,而且是在UI主线程里进行处理的。同时还会创建一个ApplicationThread对象(所以Application是在Activity之前启动的),该对象时一个Binder对象,用于与AMS进行远程通信。当AMS通过IPC调用给该Binder发生消息时,它会吧消息放在消息队列里带Handler来取。
其流程如下:
二.当apk的各种初始化好后,AMS会发生一个启动默认Activity的消息给ActivityThread,接着ActivityThread就开始创建Activity,因为Activity的作用是于用户交互,所以每个Activity都有一个对应的Window,这里Window的实现类是PhoneWindow。所以Activity随后会创建一个PhoneWindow对象,继而在创建DecorView,DecorView是显示在屏幕的*View,其里面的一个id为content的View就是我们平时调用setContentView()设置布局的地方。DecorView创建好后就是进行View的初始化,即按继承树顺序依次创建ViewGroup和View。
当这一切都创建好后,就会通知WindowManager来显示到屏幕上,WM接受到消息后就会为该界面创建对应的 WindowRoot和W对象,其中WindowRoot的作用是把显示消息告诉WMS,完成显示功能,而W的作用是接受WMS的消息返回给apk。
其流程如下:(Activity的启动流程看另外再详细解析)
三.当apk启动后Activity也显示到屏幕上了,接下来的事就是于用户交互了。系统有一个线程称为KeyQ,它会不断地读取用户在屏幕上的触摸消息,然后储存在消息队列QueueEvent里。系统同时也有一个线程叫InputDispatcherThread,它会从QueueEvent里取出消息,然后调用WMS的消息处理函数,WMS会根据该消息所属的Window,通过W类吧消息发送给该Window,再发送到对应的Activity,接下来就是消息分发机制的内容了。
其流程如下: