android应用程序消息处理机制分析之消息处理

来源:互联网 发布:考研英语网络间谍 编辑:程序博客网 时间:2024/06/05 20:40
3、消息的处理
前面分析完消息循环时,说道主线程是在Looper类的loop成员函数中
进行循环过程,那么消息的处理入口当然也是在这里了。
所以直接查看Looper.java中的loop()
public static final void loop() {  
        Looper me = myLooper();  
        MessageQueue queue = me.mQueue;    
        ......    
        while (true) {  
            Message msg = queue.next(); // might block  
            ......    
            if (msg != null) {  
                if (msg.target == null) {  
                    // No target is a magic identifier for the quit message.  
                    return;  
                }    
                ......   
//msg.target表明了谁来处理这个消息,并且msg.target是handler
//一般是谁发送这个消息,就由谁来处理,如果不指定target的话。
                msg.target.dispatchMessage(msg);    
                ......    
                msg.recycle();  
            }  
        }  
    }  
ActivityManagerService通过调用ApplicationThread类的scheduleLaunchActivity函数通知应用程序,
它可以加载应用程序的默认Activity了,而ApplicationThread类的scheduleLaunchActivity函数
最终把这个请求封装成一个消息,
然后通过ActivityThread类的成员变量mH来把这个消息加入到应用程序的消息队列中去。
现在要对这个消息进行处理了,于是就会调用H类的dispatchMessage函数进行处理。
而H类没有实现dispatchMessage(),但是它继承了Handler类。
public class Handler {  
......    
public void dispatchMessage(Message msg) {  
if (msg.callback != null) {  
handleCallback(msg);  
} else {  
if (mCallback != null) {  
if (mCallback.handleMessage(msg)) {  
return;  
}  
}  
handleMessage(msg);  
}  
}    
......  
}

紧接着调用Handler类的handleMessage()来处理这个消息,但是由于H类在继承Handler类时
重写了handleMessage(),因此这里实际调用的是H类的handleMessage()
 private final class H extends Handler {      
        ......        
        public void handleMessage(Message msg) {    
            ......    
            switch (msg.what) {    
            case LAUNCH_ACTIVITY: {    //这里在前面开始发送消息已经定义了what为H.LAUNCH_ACTIVITY
                ActivityClientRecord r = (ActivityClientRecord)msg.obj;    
    
                r.packageInfo = getPackageInfoNoCheck(    
                    r.activityInfo.applicationInfo);    
                handleLaunchActivity(r, null); //这里才开始做了启动activity的操作    
            } break;    
            ......    
            }      
        ......       
    }    
到此,android的应用程序消息处理机制已经分析完毕,稍微总结一下。
A. Android应用程序的消息处理机制由消息循环、消息发送和消息处理三个部分组成的。

    B. Android应用程序的主线程在进入消息循环过程前,会在内部创建一个Linux管道(Pipe),
这个管道的作用是使得Android应用程序主线程在消息队列为空时可以进入空闲等待状态,
并且使得当应用程序的消息队列有消息需要处理时唤醒应用程序的主线程。

    C. Android应用程序的主线程进入空闲等待状态的方式实际上就是在管道的读端等待管道中有新的内容可读,
具体来说就是是通过Linux系统的Epoll机制中的epoll_wait函数进行的。

    D. 当往Android应用程序的消息队列中加入新的消息时,会同时往管道中的写端写入内容,
通过这种方式就可以唤醒正在等待消息到来的应用程序主线程。

    E. 当应用程序主线程在进入空闲等待前,会认为当前线程处理空闲状态,
于是就会调用那些已经注册了的IdleHandler接口,使得应用程序有机会在空闲的时候处理一些事情。
原创粉丝点击