通信
- 日常开发的应用使用Handler
- 系统服务之间的通信使用到AIDL、Binder
- Zygote进程的IPC采用的是Socket机制
- Java层与Native(C/C++)层之间的纽带是JNI
Handler

- Message
- MessageQueue
- 由Looper负责管理,采用单链表的数据结构来存储消息列表,它采用先进先出的方式来管理Message。使用Intent,Message,Runnable作为任务的载体在不同的线程之间进行传递。
- 如果消息队列为空,进入睡眠等待状态
- Looper
- prapare()方法:保证每个线程最多只有一个Looper对象。首先从 ThreadLocal 中获取一个 Looper ,如果没有则向 ThreadLocal 中添加一个 new Looper ,同时新建一个 MessageQueue 。主线程的Looper在ActivityThread已经创建,不需要主动创建。
- looper()方法:从ThreadLocal中获取存入的Looper对象,启动Looper。使用一个死循环不断取出MessageQueue中的消息,并将取出的消息分给对应的Handler进行处理。循环调用 MessageQueue.next 获取消息,该函数在 MessageQueue 中没有消息的时候会阻塞,这里采用了 epoll 的I/O多路复用机制。Looper会在没有消息的时候阻塞当前线程,释放CPU资源,等到有消息到来的时候,再唤醒主线程。
- Handler
- sendMessage:会给msg的target赋值为handler自身,然后加入MessageQueue中。
- dispatchMessage:在loop中获取到消息后,会调用Message内部的Handler引用并分派事件。
- 如果发送一个成员变量target为null的message对象,那么这个线程就会退出循环
- 当Handler 定义为Activity 的非静态内部类或匿名内部类时,它会默认持有对外部Activity 的强引用。当生命周期不一致时,会导致不能及时回收引起内存泄漏。
- ThreadLocal
- ThreadLocal 是Java提供的用于保存同一进程中不同线程数据的一种机制。每个线程中都保有一个 ThreadLocalMap 的成员变量, ThreadLocalMap 内部采用 WeakReference 数组保存,数组的key即为 ThreadLocal 内部的Hash值。
- 负责存储和获取本线程的Looper。将当前Looper对象所在线程引用当做key存入ThreadLocal.table数组中,将当前Looper对象作为value存入。
Binder

- Binder使用Client-Server(c/s架构)通信方式。
- Binder框架定义了四个角色:Server,Client,ServiceManager以及Binder驱动。其中Server,Client,ServiceManager运行于用户空间,驱动运行于内核空间。ServiceManager,负责把Binder Server注册到一个容器中。
- 通过代理对象通信:Binder代理对象 Binder引用对象 Binder实体对象 Binder本地对象
- AIDL(Android Interface Definition Language Android接口定义语言),Android提供的一种Binder实现。