或者叫做启动一个app的java层代码流程,核心代码在ActivityThread类中。
startActivity流程中有一段代码
![](https://img.haomeiwen.com/i16375930/7b97c9b19fc5203f.png)
ActivityStackSupervisor中的startSpecificActivityLocked方法中,代码
if (app != null && app.thread != null) {
判断了启动Activity的宿主进程是否存在,根据相关联代码可以发现,AMS类是系统中Activity, Service等的大管家,如果宿主进程存在则进入realStartActivityLocked方法,如果宿主进程不存在,则会调用mService对象的startProcessLocked方法,而mService就是AMS类。
在AMS类中,经过一系列同名startProcessLocked方法的调用,最终来到了这样一段代码
![](https://img.haomeiwen.com/i16375930/8b2d5af57c2092bc.png)
关注下重点entryPoint的赋值“android.app.ActivityThread”,就是ActivityThread的类名称,接着往下调用
![](https://img.haomeiwen.com/i16375930/4770525912789c90.png)
![](https://img.haomeiwen.com/i16375930/6013a5fdd94f1eda.png)
最终调用了Process类的start方法,而start方法的第一个参数就是entryPoint,按照惯例,第一个参数往往是比较重要的,接下来看start方法的说明文档:
![](https://img.haomeiwen.com/i16375930/0d0f521c12163e89.png)
创建一个新的进程,而后调用这个进程类的静态main方法,放在此处就是调用ActivityThread类的main方法了。此后就是通过socket与zygote进程通信,创建新的进程,限于能力此处就不再往下分析了,接下来看ActivityThread类的main方法代码:
![](https://img.haomeiwen.com/i16375930/53dae81db032d979.png)
和new Thread后创建消息循环一样,此处也是创建一个looper,然后调用looper的loop方法,启动消息循环,来看下prepareMainLooper方法:
![](https://img.haomeiwen.com/i16375930/8fd54f17385e8789.png)
内部调用了prepare方法,使用了ThreadLocal数据结构来维护不同Thread对象内部对应的不同looper,对每个Thread的looper对象做了唯一性限制,一个Thread只能有一个looper循环。来看Looper的构造方法
![](https://img.haomeiwen.com/i16375930/9a92c72fbd29074c.png)
创建了一个MessageQueue对象,接下来看Looper的启动loop方法:
![](https://img.haomeiwen.com/i16375930/d20333194eab1848.png)
开启了一个无限for循环来遍历MessageQueue里面的消息,接下来看queue.next方法的实现,注释写到可能会阻塞:
![](https://img.haomeiwen.com/i16375930/1fa5db89072328c4.png)
上部分代码,同样是开启了一个无限for循环,nativePollOnce方法是一个native方法,此方法在没有消息的时候会阻塞,一直等到有新消息到来会唤醒,具体是在内核监听了一个文件(记不太清了)来实现的。下面的代码是判断消息是否延迟执行的。
isAsynchronous方法判断是否是一个异步消息,此处在系统刷新UI时会有用到
![](https://img.haomeiwen.com/i16375930/870ec1cf99ebb473.png)
循环中断的退出的标记mQuitting。接下来回到Looper类的loop方法
![](https://img.haomeiwen.com/i16375930/d440cd27b5d647ee.png)
msg的target对象是一个Handler类,看下dispatchMessage的实现
![](https://img.haomeiwen.com/i16375930/b75ef2971c16e3e2.png)
至此消息循环流程基本就结束了,而ActivityThread类所在线程的looper关联的handler就是H了。
网友评论