系统为每一个应用程序维护一个消息队例,
消息的发送和处理是一种异步处理机制,具体来说就是:把请求消息放入消息队列,然后由消息循环来处理消息。
Android应用程序的消息处理机制由消息循环、消息发送和消息处理这三个部分组成。
- 消息循环
Android应用程序主线程进入到这个消息循环中,进入消息循环前要创建消息队列。
消息队列初始化时有一个pipe概念,通过pipe系统的调用实现:
- 消息队列没有消息时,应用程序主线程要进入等待状态
- 消息队列有消息时,要把应用程序主线程唤醒
消息队列创建小节:
A. 在Java层,创建了一个Looper对象,这个Looper对象是用来进入消息循环的,它的内部有一个消息队列MessageQueue对象mQueue;
B. 在JNI层,创建了一个NativeMessageQueue对象,这个NativeMessageQueue对象保存在Java层的消息队列对象mQueue的成员变量mPtr中;
C. 在C++层,创建了一个Looper对象,保存在JNI层的NativeMessageQueue对象的成员变量mLooper中,这个对象的作用是,当Java层的消息队列中没有消息时,就使Android应用程序主线程进入等待状态,而当Java层的消息队列中来了新的消息后,就唤醒Android应用程序的主线程来处理这个消息。
线程会进入等待状态两种情况:
一是当消息队列中没有消息时,它会使线程进入等待状态;
二是消息队列中有消息,但是消息指定了执行的时间,而现在还没有到这个时间,线程也会进入等待状态
*.消息队列中的消息是按时间先后来排序的
- 消息的发送
把消息加入到消息队列时,分两种情况:
- 当前消息队列为空时,应用程序的主线程一般就是处于空闲等待状态了,这时候就要唤醒它。
- 当前消息队列不为空时,不需要唤醒应用程序的主线程,因为这时候它一定是在忙着处于消息队列中的消息,因此不会处于空闲等待的状态。
- 消息的处理
这个消息对象msg的成员变量target是在发送消息的时候设置好的,一般就通过哪个Handler来发送消息,就通过哪个Handler来处理消息。
- 总结:
A. Android应用程序的消息处理机制由消息循环、消息发送和消息处理三个部分组成的。
B. Android应用程序的主线程在进入消息循环过程前,会在内部创建一个Linux管道(Pipe),这个管道的作用是使得Android应用程序主线程在消息队列为空时可以进入空闲等待状态,并且使得当应用程序的消息队列有消息需要处理时唤醒应用程序的主线程。
C. Android应用程序的主线程进入空闲等待状态的方式实际上就是在管道的读端等待管道中有新的内容可读,具体来说就是是通过Linux系统的Epoll机制中的epoll_wait函数进行的。
D. 当往Android应用程序的消息队列中加入新的消息时,会同时往管道中的写端写入内容,通过这种方式就可以唤醒正在等待消息到来的应用程序主线程。
E. 当应用程序主线程在进入空闲等待前,会认为当前线程处理空闲状态,于是就会调用那些已经注册了的IdleHandler接口,使得应用程序有机会在空闲的时候处理一些事情。