Android 9.0 消息循环流程

2019-08-29  本文已影响0人  tigerzhao

或者叫做启动一个app的java层代码流程,核心代码在ActivityThread类中。

startActivity流程中有一段代码

ActivityStackSupervisor中的startSpecificActivityLocked方法中,代码

if (app != null && app.thread != null) { 

判断了启动Activity的宿主进程是否存在,根据相关联代码可以发现,AMS类是系统中Activity, Service等的大管家,如果宿主进程存在则进入realStartActivityLocked方法,如果宿主进程不存在,则会调用mService对象的startProcessLocked方法,而mService就是AMS类。

在AMS类中,经过一系列同名startProcessLocked方法的调用,最终来到了这样一段代码

关注下重点entryPoint的赋值“android.app.ActivityThread”,就是ActivityThread的类名称,接着往下调用

最终调用了Process类的start方法,而start方法的第一个参数就是entryPoint,按照惯例,第一个参数往往是比较重要的,接下来看start方法的说明文档:

创建一个新的进程,而后调用这个进程类的静态main方法,放在此处就是调用ActivityThread类的main方法了。此后就是通过socket与zygote进程通信,创建新的进程,限于能力此处就不再往下分析了,接下来看ActivityThread类的main方法代码:

和new Thread后创建消息循环一样,此处也是创建一个looper,然后调用looper的loop方法,启动消息循环,来看下prepareMainLooper方法:

内部调用了prepare方法,使用了ThreadLocal数据结构来维护不同Thread对象内部对应的不同looper,对每个Thread的looper对象做了唯一性限制,一个Thread只能有一个looper循环。来看Looper的构造方法

创建了一个MessageQueue对象,接下来看Looper的启动loop方法:

开启了一个无限for循环来遍历MessageQueue里面的消息,接下来看queue.next方法的实现,注释写到可能会阻塞:

上部分代码,同样是开启了一个无限for循环,nativePollOnce方法是一个native方法,此方法在没有消息的时候会阻塞,一直等到有新消息到来会唤醒,具体是在内核监听了一个文件(记不太清了)来实现的。下面的代码是判断消息是否延迟执行的。

isAsynchronous方法判断是否是一个异步消息,此处在系统刷新UI时会有用到

循环中断的退出的标记mQuitting。接下来回到Looper类的loop方法

msg的target对象是一个Handler类,看下dispatchMessage的实现

至此消息循环流程基本就结束了,而ActivityThread类所在线程的looper关联的handler就是H了。

上一篇下一篇

猜你喜欢

热点阅读