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实现。
相关推荐
百锦再3 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
2501_916008894 小时前
全面介绍Fiddler、Wireshark、HttpWatch、SmartSniff和firebug抓包工具功能与使用
android·ios·小程序·https·uni-app·iphone·webview
玉梅小洋5 小时前
Windows 10 Android 构建配置指南
android·windows
Libraeking6 小时前
视觉篇:Canvas 自定义绘图与高级动画的华丽圆舞曲
android·经验分享·android jetpack
Fushize7 小时前
多模块架构下的依赖治理:如何避免 Gradle 依赖地狱
android·架构·kotlin
Jomurphys8 小时前
Kotlin - 类型别名 typealias
android·kotlin
Haha_bj8 小时前
Flutter ——flutter_screenutil 屏幕适配
android·ios
Haha_bj8 小时前
Flutter ——device_info_plus详解
android·flutter·ios
前端小伙计8 小时前
Android/Flutter 项目统一构建配置最佳实践
android·flutter
Mr_sun.10 小时前
Day09——入退管理-入住-2
android·java·开发语言