或者叫做启动一个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了。