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实现。
相关推荐
天空之城--8 小时前
Android Flutter行业动态与学习参考(2026年8月)
android·flutter
quantdash_cc8 小时前
基于 QuantDash 5 分钟 K 线的网格交易策略参数网格搜索寻优实战
android·开发语言·pandas·量化·quantdash
杉氧9 小时前
原生交互:如何在 Flutter 中嵌入 Android/iOS 原生组件并解决手势冲突
android·flutter·dart
Android打工仔10 小时前
Continuation 的链式关系 —— 一个 suspend 函数如何把结果交还给调用者?
android·kotlin
hunterandroid10 小时前
[Android 从零到一] Kotlin Channel 与复杂并发场景:从生产者-消费者到结构化并发治理
android
FlightYe10 小时前
linux系统编程(八):阻塞与非阻塞IO对比
android·linux·运维·服务器·github·vim
恋猫de小郭11 小时前
Flutter iOS Deep Link 为什么会突然失效:一系列难以言喻的问题
android·前端·flutter
qq_4228286211 小时前
android 图形学之图层数据送显(八)
android
Kapaseker11 小时前
小白都看得懂的 Skill 教程 - 初识 Skill
android·kotlin·vibecoding
神奇小梵12 小时前
安全和开发的需要了解的知识————下载内容的安全,和下载内容如何运行
android·windows·安全·个人开发