Android 通信机制简析

通信

  • 日常开发的应用使用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实现。
相关推荐
Kapaseker16 小时前
一杯美式讲完 Sealed Class
android·kotlin
冬奇Lab1 天前
PowerManagerService(下):Doze模式与电池优化
android·源码阅读
砖厂小工1 天前
Compose 中函数引用 vs Lambda:到底该用哪个?
android
Kapaseker2 天前
详解 Compose background 的重组陷阱
android·kotlin
黄林晴2 天前
Kotlin 2.3.20-RC2 来了!JPA 开发者狂喜,6 大更新一文速览
android·kotlin
kymjs张涛2 天前
OpenClaw 学习小组:初识
android·linux·人工智能
范特西林2 天前
实战演练——从零实现一个高性能 Binder 服务
android
范特西林2 天前
代码的生成:AIDL 编译器与 Parcel 的序列化艺术
android
范特西林2 天前
深入内核:Binder 驱动的内存管理与事务调度
android
范特西林2 天前
解剖麻雀:Binder 通信的整体架构全景图
android