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实现。
相关推荐
饭小猿人13 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
_李小白13 小时前
【android opencv学习笔记】Day 8: remap(像素位置重映射)
android·opencv·学习
美狐美颜SDK开放平台13 小时前
多场景美颜SDK解决方案:直播APP(iOS/安卓)开发接入详解
android·人工智能·ios·音视频·美颜sdk·第三方美颜sdk·短视频美颜sdk
嗷o嗷o14 小时前
Android BLE 里,MTU、分包和长数据发送到底该怎么处理
android
Gary Studio16 小时前
Android AIDL HAL工程结构示例
android
y = xⁿ16 小时前
MySQL八股知识合集
android·mysql·adb
andr_gale17 小时前
04_rc文件语法规则
android·framework·aosp
祖国的好青年18 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴18 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle