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