android消息机制
2017-04-18 本文已影响2人
hammercui
消息机制由Handler/Looper/MessageQueue/Message这4个类构成,Android的四剑客Activity,Service,Broadcast,ContentProvider的启动过程和交互,都离不开消息机制,Android某种意义上可以看做是一个消息驱动的系统。
这张图解释了app进程和系统进程之间如何通信:

我自己总结为
- ActivityThread为一个app的入口,有main函数。
- main函数中执行Looper.loop(),里面执行死循环,来监听收到的消息
- 消息是Message以消息队列MessageQueue形式存在,而Handler是消息辅助类用来分发消息。
- 当MessageQueue中消息为空时,阻塞并退出死循环,执行idleHandler线程,如果没有则执行Linux的epoll操作,进入cpu休眠
- ActivityThread的main函数中通过thread.attach(false)创建一个Binder线程(具体是指ApplicationThread,Binder的服务端,用于接收系统服务AMS发送来的事件),该Binder线程通过Handler将Message发送给主线程,同时拥有binder客户端(ActivityManagerProxy),用来向系统进程system_server发送事件消息。
- ActivityThread当有消息到达时,通过往pipe管道写端写入数据唤醒主线程工作,也是用的epoll机制(当然这是linux的知识)
注意:
ActivityThread不是线程,不是线程,没有继承自HanderThread,看起来像线程而已,运行在Zygote fork出来的进程里(Zygote是Android特有的进程,从Linux开机启动的init进程fork出来,直译为受精卵进程,也就是Android所有进程都从Zygote fork出来)
参考资料
Android消息机制1-Handler(Java层)
初识Zygote进程
知乎Android中为什么主线程不会因为Looper.loop()里的死循环卡死?中@Gityuan的回答