Android應用程序消息處理機制(Looper、Handler)分析(11)
在queueOrSendMessage函數(shù)中,又進一步把上面?zhèn)鬟M來的參數(shù)封裝成一個Message對象msg,然后通過mH.sendMessage 函數(shù)把這個消息對象msg加入到應用程序的消息隊列中去。
這里的mH是ActivityThread類的成員變量,它的類型為H,繼承于Handler 類。
這個H類就是通過其成員函數(shù)handleMessage函數(shù)來處理消息的了,后面我們分析消息的處理過程時會看到。
它定義在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類的這個mH成員變量是什么時候創(chuàng)建的呢?我們前面在分析應用程序的消息循環(huán)時,說到當應用程序進程啟動之后,就會加載 ActivityThread類的main函數(shù)里面,在這個main函數(shù)里面,在通過Looper類進入消息循環(huán)之前,會在當前進程中創(chuàng)建一個 ActivityThread實例:
- [java] view plaincopypublic final class ActivityThread {
- ......
- public static final void main(String[] args) {
- ......
- ActivityThread thread = new ActivityThread();
- thread.attach(false);
- ......
- }
- }
- 在創(chuàng)建這個實例的時候,就會同時創(chuàng)建其成員變量mH了:
- [java] view plaincopypublic final class ActivityThread {
- ......
- final H mH = new H();
- ......
- }
前面說過,H類繼承于Handler類,因此,當創(chuàng)建這個H對象時,會調(diào)用Handler類的構(gòu)造函數(shù),這個函數(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;
- ......
- }