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

Android Aidl跨进程通讯(三)--进阶使用

学更好的别人,

做更好的自己。

——《微卡智享》

e4779c31e5bb17eb75b5540ca986230a.jpeg

本文长度为2478,预计阅读6分钟

前言

Android的AIDL使用和异常报错都已经介绍过了,今天这篇还是在原来的Demo基础上加入几个AIDL的进阶使用方法。

83980b3041623a9f09e87313c3a94fb1.png

AIDL进阶使用

4da1eb7715c927a7f2ef822dfd3db7a7.png

微卡智享

in,out,inout的使用

关于in,out,inout在AIDL的基础介绍中有提到过

AIDL中还有定向的Tag,包括了in、out、inout。其中 in 表示数据只能由客户端流向服务端, out 表示数据只能由服务端流向客户端,而 inout 则表示数据可在服务端与客户端之间双向流通。

Vaccae,公众号:微卡智享Android Aidl跨进程通讯的简单使用

根据字面意思可以很简单的理解,所以我们直接做一个函数实现inout的方法即可。

  1. 在服务端的Aidl文件中加入一个新的函数updateTestDatsList,输入的参数设置为inout

    72ecd805f35133ca0de3778dabbdc77c.png

  2. Build后在Service的object : ITestDataAidlInterface.Stub()里面写入实现,这里我们先将传入的list里面再自定义加入一条,然后插入到Service缓存的List列表中,再将传入的listdata清空后,把Service缓存中的所有数据都插入传入的listdata

    dcdbd58987528bcc6fe7edd541ce5138.png

  3. 因为是跨进程,所以客户端需要将修改后的Aidl复制过来替换原来的,然后在MainActivity中写入实现调用

    00eb5ad582a250b3ed07bee217feb03d.png

    53651c7c56937029577f70e13e51b47e.png

    运行效果

    d3b2228e4e517630bfcfa815b9dc8c47.png

14c92d184347825876b30f605571d94b.png

0e93f54bf644defebddf6a56b3bb9006.png

点击更新列表后的对比,可以看到,使用inout参数,传入的list最后也已经修改完成。

AIDL使用Bundle传递多个数据

AIDL可以使用Bundle类封装通讯数据,用于传递一些复杂的对象或者多个对象。

Bundle类是一个键值对的容器,它可以存储不同类型的数据,并且实现了Parcelable接口,所以可以在进程间传输。

  • Service的AIDL接口加入新的函数transBundle,传入的参数就是Bundle

5ec2f32a5b1504e176b7ed3a1020c8c9.png

  • 在Service加入接口实现,这里我们测试里面加入一个Float,一个Int,和一个List数据,将原来的价格和数量都统一改为一样的数据后,再将传入的list加入到后面,最后展现出来,

4323edfbc7984e8bc77b95187d1c738b.png

划重点

Android有两种不同的classloaders:framework classloader和apk classloader,其中framework classloader知道怎么加载android classes,apk classloader继承自framework classloader,所以也知道怎么加载android classes。但在应用刚启动时,默认class loader是apk classloader,在系统内存不足应用被系统回收会再次启动,这个默认class loader会变为framework classloader了,所以对于自己的类会报ClassNotFoundException,就会出现android.os.BadParcelableException: ClassNotFoundException when unmarshalling

所以在bundle数据读取前,先设置classloader后,才能正确地读取自定义类

it.classLoader = TestData::class.java.classLoader

override fun transBundle(bundle: Bundle?): MutableList<TestData> {bundle?.let { it ->/*Android有两种不同的classloaders:framework classloader和apk classloader,其中framework classloader知道怎么加载android classes,apk classloader继承自framework classloader,所以也知道怎么加载android classes。但在应用刚启动时,默认class loader是apk classloader,在系统内存不足应用被系统回收会再次启动,这个默认class loader会变为framework classloader了,所以对于自己的类会报ClassNotFoundException就会出现android.os.BadParcelableException: ClassNotFoundException when unmarshalling*///所以在bundle数据读取前,先设置classloader后,才能正确的读取自定义类it.classLoader = TestData::class.java.classLoaderval price = it.getFloat("price")val qty = it.getInt("qty")mTestDatas.map { t->t.price = pricet.qty = qty}val list = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {it.getParcelableArrayList("listdatas", TestData::class.java)} else {it.getParcelableArrayList<TestData>("listdatas")}list?.let { item->mTestDatas.addAll(item)}}return mTestDatas}
  • 客户端中一样要把AIDL复制过来后,写实现方法

eaf105e68f5b5ae54d3f4ce1c6c80e3f.png

17d72430696f2118600e9c17af3ef1cd.png

运行效果

8de47c84cf6fb200a523d94555acebd3.png

2aacb10bfd4c80ae007e0aac65351aa2.png

d2b72a19a665fa04fd04e209865fc1a7.png

关于oneway关键字

AIDL中的oneway关键字,主要用来使IPC调用变成非阻塞的。

oneway需要注意的几点:

  1. 将远程调用改为异步调用,使得远程调用变成非阻塞式的,客户端不需要等待服务端的处理,只是发送数据并立即返回。要注意的是,oneway修饰本地调用没有效果,仍然是同步的,客户端需要等待服务端的处理。

  2. 在同一个IBinder对象调用中,会按照调用顺序依次执行,不同的IBinder对象可能导致调用顺序和执行顺序不一致。

  3. oneway不能带有返回值或抛出异常,因为客户端是无法接收的。

Demo源码中也已经更新上传了。

源码地址

https://github.com/Vaccae/AndroidAIDLDemo.git

点击原文链接可以看到“码云”的源码地址

c58e4de0ca89391349ba2b8a1db2ca08.png

a9ea02f8e957fa03f0ce2e6e337ab7eb.png

往期精彩回顾

 

ee3ad239a49ee122e88f1fbbf1344b26.jpeg

Android Aidl跨进程通讯(二)--异常捕获处理

 

 

547c7d41a4b05fafaa9eea0572487e20.jpeg

Android Aidl跨进程通讯的简单使用

 

 

db1fbae1322f231a4086d3930539717b.jpeg

Android BlueToothBLE入门(三)——数据的分包发送和接收(源码已更新)

 

 

相关文章:

Android Aidl跨进程通讯(三)--进阶使用

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为2478字&#xff0c;预计阅读6分钟 前言 Android的AIDL使用和异常报错都已经介绍过了&#xff0c;今天这篇还是在原来的Demo基础上加入几个AIDL的进阶使用方法。 】 AIDL进阶使用 微卡智享 in,out,inout的使…...

vue.js+nodejs家庭个人理财收支管理系统5x6nf

本收支管理系统以vue.js作为框架&#xff0c;nodejs语言&#xff0c;B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块&#xff1a;用户管理、收入分类、支出分类、每日收入、每日支出等模块。 本文的组织结构如下&#xff1a; 1、绪论。综述了本文的研究背景…...

怎样去掉win11快捷方式的小箭头

前有创造注册表新值的方法,现在有了注册表加文件的方法 开始 先下载这个文件,里面有要用到的信息 下载 保存文件到电脑,并解压 有两个文件, 一个是 Remove_shortcut_arrow_icon.reg 一个是blank.ico 把第二个文件移动到 C:\Windows 文件夹, 然后点击打开文件, 如果提示是…...

Django项目如何配置日志文件信息

1、以dict的方式配置在settings.py中 # 日志文件简单配置LOGGING {"version": 1,"disable_existing_loggers": False,"handlers": {"file": {"level": "DEBUG","class": "logging.FileHandler&…...

遇到一个异步任务后是否会直接加入到异步队列当中

在javascript中&#xff0c;异步任务不会立即加入到异步队列&#xff08;任务队列&#xff09;中&#xff0c;而是根据不同的异步操作类型和执行环境&#xff0c;将对应的回调函数函数或事件加入到不同的队列中 javascript中常见的异步操作包括&#xff1a; 定时器&#xff1…...

SUSE Linux文件系统在线扩容

前几天巡检发现&#xff0c;SUSE 12文件系统/vg01下面的某个文件空间不足&#xff0c;挂载点是/oracle,容量不够&#xff0c;需要进行扩容。 新的空间是从一台HP的存储上新映射的。由于映射的LUN是从windows主机上回收&#xff0c;然后直接映射的&#xff0c;所以在linux识别新…...

智能电话机器人的出现,能够解决哪些问题?

经济的繁荣与高速的发展&#xff0c;使得电销这个方式快速地融合在房地产与金融投资等大部分行业上。在电销人员与客户的沟通上&#xff0c;难免会出现很多问题&#xff0c;毕竟所面对的客户都是各行各业&#xff0c;他们有着不同的经历和身份。 对于时常需要处理客户投诉、安…...

16-数据结构-图的存储结构

简介&#xff1a;主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码&#xff0c;邻接矩阵又分为有权图和无权图&#xff0c;区别就是有数据的地方填权值&#xff0c;无数据的地方可以填0或者∞&#xff0c;而有权图和无权图&#xff0c;又细分为有向图和无向…...

递推算法及常见示例(C++、Python实现)

递推算法及常见示例&#xff08;C、Python实现&#xff09; 递推算法是一种用若干步可重复运算来描述复杂问题的方法&#xff0c;它是一种序列计算中的常用算法。通常是通过计算前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次…...

vscode调试程序设置

主要设置和json内容如下&#xff1a; cpp_properties.json内容&#xff1a; {"configurations": [ //C intellisense插件需要这个文件&#xff0c;主要是用于函数变量等符号的只能解析{"name": "Win32","includePath": ["${work…...

电商邮件营销攻略:教你如何有效运营邮件营销策略!

作为一种领先的营销渠道&#xff0c;电子邮件营销已被电子商务公司作为推动客户参与度、促进销售和提高ROI的不可或缺的方式。在这篇文章中&#xff0c;我们将深入探讨电子商务公司为什么要做EDM邮件营销&#xff1f;以及电商公司怎么做邮件营销&#xff1f; 一、电子商务公司…...

centos+jenkins+pycharm

思路&#xff1a;架构 一. 在centos上搭建jenkins环境 二. pycharm与gitee建立连接 三. 访问jenkins&#xff0c;添加任务 3.1 添加一个自由风格的任务 3.2 添加git项目路径及访问git的账号和密码 3.3 执行start.sh脚本 四. 浏览器访问jenkins执行任务...

Linux-Centos7安装Docker

文章目录 一、前言二、Docker安装1、Docker及系统版本2、Docker的自动化安装3、Docker手动安装3.1、卸载Docker&#xff08;可选&#xff09;3.2、设置源仓库3.3、Docker安装3.4、Docker启动3.5、验证是否安装成功3.5.1、拉取镜像3.5.2、查看镜像3.5.3、运行镜像 3.6、删除Dock…...

前端Vue入门-day06-路由进阶

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 路由的封装抽离 声明式导航 导航链接 两个类名 自定义高亮类名 跳转传参 1. 查询参数传参 2. 动态…...

数据库服务器是什么意思?数据库服务器有哪些?

数据库服务器是什么意思?现在市场上有很多的服务器的类型&#xff0c;比如数据库服务器&#xff0c;但是很多人对数据库服务器是什么意思?数据库服务器有哪些并不是很熟悉&#xff0c;那么&#xff0c;聚名企服为您详解一下。 一&#xff1a;数据库服务器是什么意思 数据库服…...

配电网智能软开关(sop)规划模型matlab

目录 1 主要内容 2 部分程序 3 程序结果 1 主要内容 该程序参考文献《基于改进灵敏度分析的有源配电网智能软开关优化配置》&#xff0c;采用二阶锥算法&#xff0c;以改进的IEEE33节点配电系统模型作为分析对象&#xff0c;以联络开关位置作为sop安装备选位置&#xff0c;以…...

Qt 常用函数

设置编码 #if (QT_VERSION < QT_VERSION_CHECK(5,0,0)) #if _MSC_VERQTextCodec *codec QTextCodec::codecForName("gbk"); #elseQTextCodec *codec QTextCodec::codecForName("utf-8"); #endifQTextCodec::setCodecForLocale(codec);QTextCodec::se…...

UMA 2 - Unity Multipurpose Avatar☀️六.Advanced Occlusion高级遮挡功能解决皮肤服饰穿模

文章目录 🟥 本节功能效果展示🟧 基础项目配置🟨 本节项目配置🟩 配置MeshHideAsset1️⃣ 创建MeshHideAsset2️⃣ 配置SlotDataAsset3️⃣ 配置遮挡信息🟦 将 MeshHideAsset 配置到 Recipe🟥 本节功能效果展示 未遮挡前的穿模问题: 遮挡后效果:...

深度解析自然语言处理之篇章分析

在本文中&#xff0c;我们深入探讨了篇章分析的概念及其在自然语言处理&#xff08;NLP&#xff09;领域中的研究主题&#xff0c;以及两种先进的话语分割方法&#xff1a;基于词汇句法树的统计模型和基于BiLSTM-CRF的神经网络模型。 关注TechLead&#xff0c;分享AI全维度知识…...

Python3.11教程3:模块和包(pip/conda)、文件系统(os/ shutil/json/pickle/openpyxl/xlrd)

文章目录 七、模块和包7.1 模块7.1.1 模块搜索路径7.1.2 PYTHONPATH和sys.path7.1.2 模块的导入和常见错误7.1.3 模块的缓存机制7.1.4 __name__ 和 __main__ 函数 7.2 标准库7.3 包7.3.1 创建包7.3.2 导入包7.3.3 pip包管理器7.3.4 conda 7.4 如何组织和管理大型项目中的模块与…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...