![Android进阶解密](https://wfqqreader-1252317822.image.myqcloud.com/cover/331/31186331/b_31186331.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.4 消息循环创建过程
在3.2.2节中学习了Zygote接收请求并创建应用程序进程,还有一个遗留的知识点就是,应用程序进程启动后会创建消息循环。首先我们回到RuntimeInit的invokeStaticMain方法,代码如下所示:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer821.jpg?sign=1739551450-ppGlc1Rpk1RlsCoTRq4yNrgffr9y3fGX-0-449b307c1331cddbd5d4cac66b1c17dc)
invokeStaticMain方法在3.2节已经讲过,这里不再赘述,主要是看最后一行,会抛出一个MethodAndArgsCaller异常,这个异常会被ZygoteInit的main方法捕获,如下所示:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer822.jpg?sign=1739551450-FnNGos6bZF9IJj65n8R4iG9utPvCYvBS-0-8d671f81b10c7a610f4f26538eb3d7ad)
在注释1处捕获到MethodAndArgsCaller时会执行caller的run方法,如下所示:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer823.jpg?sign=1739551450-xmNxHer4ogVeImxHS1JtOqluQUo2cxiZ-0-bedd27c2d0788a94f3249638fa1b17de)
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer824.jpg?sign=1739551450-fxCpMXTY9Mg2rp9dciycVJlXX8LNH2Kd-0-b8f37fbb34cca066b46c917066734d00)
根据3.2.2节我们得知,mMethod指的就是ActivityThread的main方法,mArgs指的是应用程序进程的启动参数。在注释1处调用ActivityThread的main方法,代码如下所示:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer825.jpg?sign=1739551450-YDGkt6jmnSw57tTS5pTqltHvihHAJVy2-0-69938916645a1c71b130e4962ce2a3c5)
ActivityThread类用于管理当前应用程序进程的主线程,在注释1处创建主线程的消息循环Looper,在注释2处创建ActivityThread。在注释3处判断Handler类型的sMainThreadHandler 是否为null,如果为null则在注释4处获取H类并赋值给sMainThreadHandler,这个H类继承自Handler,是ActivityThread的内部类,用于处理主线程的消息循环,在第4章、第5章我们将会经常提到它。在注释5处调用Looper的loop方法,使得Looper开始处理消息。可以看出,系统在应用程序进程启动完成后,就会创建一个消息循环,这样运行在应用程序进程中的应用程序可以方便地使用消息处理机制。