当前位置: 首页 > news >正文

AIDL进程间通信

一、项目开启AIDL

在使用AIDL的模块下build.gradle 文件中添加以下代码

android {...buildFeatures {aidl true}
}

操作完需要rebuild

二、创建aidl服务接口

假设当前所需要的包名为com.jingluo.test_aidl ,那么aidl就需要处于同样的路径下,即如下目录格式。假设服务接口文件为IModuleServiceIModuleCallback。实现接口的文件为TestAIDLService

- main- aidl- com- jingluo- test_aidl- IModuleService.aidl- IModuleCallback.aidl- kotlin-com- jingluo- test_aidl- TestAIDLService.kt

aidl支持如下几种数据类型

  • 基本数据类型:
    boolean:布尔值(true 或 false)
    byte:8 位有符号整数
    char:16 位 Unicode 字符
    double:64 位双精度浮点数
    float:32 位单精度浮点数
    int:32 位有符号整数
    long:64 位有符号整数
    short:16 位有符号整数
  • Java 对象:
    String:字符串
    CharSequence:字符序列
  • Bundle:
    Bundle 类可以用于在进程间传递一组键值对的集合,类似于一个映射表。
  • List 和 Map:
    List:支持基本数据类型和支持 Parcelable 接口的对象类型的列表。
    Map<K, V>:支持基本数据类型和支持 Parcelable 接口的对象类型的映射表。
  • Parcelable:
    自定义的类如果实现了 Parcelable 接口,也可以在 AIDL 中使用。这是一个用来序列化对象的接口,可以将对象数据从一个进程传递到另一个进程。
  • Surface
  • RemoteView

IModuleService.aidl

package com.jingluo.test_aidl;import android.view.Surface;
import com.jingluo.test_aidl.IModuleCallback;interface IModuleService {void handleMethod(String method);void registerCallback(IModuleCallback callback);
}

IModuleCallback.aidl

package com.jingluo.test_aidl;interface IModuleCallback {void onLoginCallback(int code, String msg);
}

操作完需要rebuild

三、aidl接口实现(服务端)

TestAIDLService.kt

...
import android.os.IBinder
import android.app.Service
import com.jingluo.test_aidl.IModuleCallback
import com.jingluo.test_aidl.IModuleService
...class TestAIDLService: Service() {private lateinit var context: Context// 按需实现,我这里主要是需要拿到Contextoverride fun onCreate() {super.onCreate()context = this}private var remoteCallback: IModuleCallback? = nullprivate val binder = object : IModuleService.Stub() {override fun handleMethod(method: String) {if (method == "loginResult") {// eg. remoteCallback?.onLoginCallback(0, "success")} else if (method == "login") {// 具体实现}}override fun registerCallback(callback: IModuleCallback) {remoteCallback = callback;DeviceManager.registerRemoteCallback(callback)}}override fun onBind(p0: Intent?): IBinder {return binder}
}

四、客户端使用

...
import com.jingluo.test_aidl.TestAIDLService
...class TestAIDLActivity: AppCompatActivity() {private var moduleService: IModuleService? = nullprivate val moduleCallback = object : IModuleCallback.Stub() {override fun onLoginCallback(code: Int, msg: String) {/// 相应处理}}private val mDeathRecipient: IBinder.DeathRecipient = object : IBinder.DeathRecipient {override fun binderDied() {// 解绑当前监听,重新启动服务moduleService?.asBinder()?.unlinkToDeath(this, 0)moduleService = null// 重新绑定服务bindService()}}private val connection: ServiceConnection = object : ServiceConnection {override fun onServiceConnected(name: ComponentName, service: IBinder) {moduleService = IModuleService.Stub.asInterface(service)moduleService?.registerCallback(moduleCallback)moduleService?.asBinder()?.linkToDeath(mDeathRecipient, 0)}override fun onServiceDisconnected(name: ComponentName) {moduleService = null}}private fun bindService() {val intent = Intent(context, TestAIDLService::class.java)context.bindService(intent, connection, Context.BIND_AUTO_CREATE)}
}

同时需要在AndroidManifest.xml中进行声明该服务。注意android:process必须设置,否则分进程不生效。

<application><service android:name=".TestAIDLService"android:process=":remote"android:enabled="true"android:exported="false" />
</application>
http://www.xdnf.cn/news/149725.html

相关文章:

  • node.js 实战——从0开始做一个餐厅预订(express+node+ejs+bootstrap)
  • js的作用域,作用域链,执行上下文,变量对象,活动对象
  • 谷歌AI眼镜:你的第二大脑,未来人机共生从这里开始
  • 前端如何获取文件的 Hash 值?多种方式详解、对比与实践指南
  • 列表与字典应用
  • 动态规划算法详解(C++)
  • EFL格式|动态库加载 | 重谈地址空间(2)
  • 复合材料高置信度 DIC 测量与高级实验技术研讨会邀请函
  • 达梦数据库压力测试报错超出全局hash join空间,适当增加HJ_BUF_GLOBAL_SIZE解决
  • 【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析
  • mysql 安装
  • 项目实战-基于大数据分析的暖通系统改造模型【感谢Akila公司以及学院的支持】
  • Lobechat使用WolframAlpha MCP工具减少LLM幻觉
  • Java 设计模式心法之第23篇 - 状态 (State) - 让对象的行为随状态优雅切换
  • 【蓝桥杯选拔赛真题104】Scratch回文数 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析
  • IPOF(Input-Process-Output-Feedback)方法学简介
  • XMOS空间音频——在任何设备上都能提供3D沉浸式空间音频且实现更安全地聆听
  • 【计算机视觉】CV实践项目- 基于PaddleSeg的遥感建筑变化检测全解析:从U-Net 3+原理到工程实践
  • numpy.random.normal与numpy.random.randn的区别与联系
  • 雷电模拟器怎么更改IP地址
  • 使用 Python 项目管理工具 uv 快速创建 MCP 服务(Cherry Studio、Trae 添加 MCP 服务)
  • Jetpack Compose 基础组件学习2.1:Surface
  • stack __ queue(栈和队列)
  • 分布式事务 两阶段提交协议(2PC的原理、挑战)
  • 大模型微调 - 自注意力机制
  • 【统计学习】递归最小二乘算法与奇异值分解
  • #什么是爬虫?——从技术原理到现实应用的全面解析 VI
  • Vue回调函数中的this
  • 【CF】Day43——Codeforces Round 906 (Div. 2) E1
  • Libconfig 修改配置文件里的某个节点