Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析(11)
在queueOrSendMessage函數(shù)中,又進(jìn)一步把上面?zhèn)鬟M(jìn)來(lái)的參數(shù)封裝成一個(gè)Message對(duì)象msg,然后通過(guò)mH.sendMessage 函數(shù)把這個(gè)消息對(duì)象msg加入到應(yīng)用程序的消息隊(duì)列中去。
這里的mH是ActivityThread類的成員變量,它的類型為H,繼承于Handler 類。
這個(gè)H類就是通過(guò)其成員函數(shù)handleMessage函數(shù)來(lái)處理消息的了,后面我們分析消息的處理過(guò)程時(shí)會(huì)看到。
它定義在frameworks/base/core/java/android/app/ActivityThread.java文件中:
- [java] view plaincopypublic final class ActivityThread {
- ......
- private final class H extends Handler {
- ......
- public void handleMessage(Message msg) {
- ......
- switch (msg.what) {
- ......
- }
- ......
- }
- ......
- }
ActivityThread類的這個(gè)mH成員變量是什么時(shí)候創(chuàng)建的呢?我們前面在分析應(yīng)用程序的消息循環(huán)時(shí),說(shuō)到當(dāng)應(yīng)用程序進(jìn)程啟動(dòng)之后,就會(huì)加載 ActivityThread類的main函數(shù)里面,在這個(gè)main函數(shù)里面,在通過(guò)Looper類進(jìn)入消息循環(huán)之前,會(huì)在當(dāng)前進(jìn)程中創(chuàng)建一個(gè) ActivityThread實(shí)例:
- [java] view plaincopypublic final class ActivityThread {
- ......
- public static final void main(String[] args) {
- ......
- ActivityThread thread = new ActivityThread();
- thread.attach(false);
- ......
- }
- }
- 在創(chuàng)建這個(gè)實(shí)例的時(shí)候,就會(huì)同時(shí)創(chuàng)建其成員變量mH了:
- [java] view plaincopypublic final class ActivityThread {
- ......
- final H mH = new H();
- ......
- }
前面說(shuō)過(guò),H類繼承于Handler類,因此,當(dāng)創(chuàng)建這個(gè)H對(duì)象時(shí),會(huì)調(diào)用Handler類的構(gòu)造函數(shù),這個(gè)函數(shù)定義在frameworks/base/core/java/android/os/Handler.java文件中:
- [java] view plaincopypublic class Handler {
- ......
- public Handler() {
- ......
- mLooper = Looper.myLooper();
- ......
- mQueue = mLooper.mQueue;
- ......
- }
- final MessageQueue mQueue;
- final Looper mLooper;
- ......
- }