点击领取优惠~
775 字
4 分钟
主线程消息循环机制建立过程
主线程消息循环机制建立过程
- zygote进程监听接收AMS的请求,fork创建子应用进程,然后pid为0时进入子进程空间,然后在 ZygoteInit#zygoteInit中完成进程的初始化动作
public static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges, String[] argv, ClassLoader classLoader) { ... // 原生添加名为“ZygoteInit ”的systrace tag以标识进程初始化流程 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit"); RuntimeInit.redirectLogStreams(); // 1.RuntimeInit#commonInit中设置应用进程默认的java异常处理机制 RuntimeInit.commonInit(); // 2.ZygoteInit#nativeZygoteInit函数中JNI调用启动进程的binder线程池 ZygoteInit.nativeZygoteInit(); // 3.RuntimeInit#applicationInit中反射创建ActivityThread对象并调用其“main”入口方法 return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv, classLoader); }- 应用进程启动后,初始化过程中主要依次完成以下几件事情:
- 应用进程默认的java异常处理机制(可以实现监听、拦截应用进程所有的Java crash的逻辑);
- JNI调用启动进程的binder线程池(注意应用进程的binder线程池资源是自己创建的并非从zygote父进程继承的);
- 通过反射创建ActivityThread对象并调用其“main”入口方法
public static void main(String[] args) { ... // 1.创建Looper、MessageQueue Looper.prepareMainLooper(); ... // 2.启动loop消息循环,开始准备接收消息 Looper.loop(); ...}// 3.创建主线程Handler对象final H mH = new H();
class H extends Handler { ...}- 可以看到进程ActivityThread#main函数初始化的主要逻辑是:
- 创建并启动主线程的loop消息循环;
- 通过binder调用AMS的attachApplication接口将自己attach注册到AMS中
主线程初始化完成后,主线程就有了完整的 Looper、MessageQueue、Handler,此时 ActivityThread 的 Handler 就可以开始处理 Message,包括 Application、Activity、ContentProvider、Service、Broadcast 等组件的生命周期函数,都会以 Message 的形式,在主线程按照顺序处理,这就是 App 主线程的初始化和运行原理
主线程初始化完成后,主线程就进入阻塞状态,等待 Message,一旦有 Message 发过来,主线程就会被唤醒,处理 Message,处理完成之后,如果没有其他的 Message 需要处理,那么主线程就会进入休眠阻塞状态继续等待。可以说Android系统的运行是受消息机制驱动的,而整个消息机制是由上面所说的四个关键角色相互配合实现的(Handler、Looper、MessageQueue、Message),其运行原理如下图所示:
- Handler : Handler 主要是用来处理 Message,应用可以在任何线程创建 Handler,只要在创建的时候指定对应的 Looper 即可,如果不指定,默认是在当前 Thread 对应的 Looper。
- Looper: Looper 可以看成是一个循环器,其 loop 方法开启后,不断地从 MessageQueue 中获取 Message,对 Message 进行 Delivery 和 Dispatch,最终发给对应的 Handler 去处理。
- MessageQueue:MessageQueue 就是一个 Message 管理器,队列中是 Message,在没有 Message 的时候,MessageQueue 借助 Linux 的 ePoll机制,阻塞休眠等待,直到有 Message 进入队列将其唤醒。
- Message:Message 是传递消息的对象,其内部包含了要传递的内容,最常用的包括 what、arg、callback 等。
主线程消息循环机制建立过程