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

news2024/11/27 12:31:00

学更好的别人,

做更好的自己。

——《微卡智享》

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.classLoader


                    val price = it.getFloat("price")
                    val qty = it.getInt("qty")


                    mTestDatas.map { t->
                        t.price = price
                        t.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入门(三)——数据的分包发送和接收(源码已更新)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/978160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

定时线程池原理解析

基本使用 ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后运行任务&#xff0c;或者定期执行任务。 public class ScheduledThreadPoolExecutorTest {public static void main(String[] args) {ScheduledThreadPoolExecutor threadPoolExecu…

QT DAY7

主要完成多人聊天室&#xff0c;注册与登录使用sql3数据库进行对密码的保存&#xff0c;避免了用户重复登录、错误密码登录、重复注册的问题&#xff0c;之后使用TCP通信&#xff0c;连接上服务器后可在聊天室多人交流

怎么处理zk或redis脑裂

很极端场景会出现脑裂 什么是分布式的脑裂 怎么理解zk脑裂 就是ZK&#xff0c;与客户端可能因为网络原因&#xff0c;客户端A还在跑着后续程序&#xff0c;而zk与客户端之前的心跳断了&#xff0c;此zk就把这节点给删除了&#xff0c;这时另一个客户会加锁成功&#xff0c;就样…

[Java]异常

目录 1.异常的概念与体系结构 1.1异常的概念 1.1.1算术异常 1.1.2数组越界异常 1.1.3空指针异常 1.2异常的体系结构 1.3异常的分类 2.异常的处理 2.1 防御式编程 2.2异常的抛出 2.3异常的捕获 2.3.1 异常声明throws 将光标放在抛出异常方法上&#xff0c;alt Insert …

咖啡店小程序:吸引顾客的创新营销手段

近日&#xff0c;“酱香拿铁”的大火让大家再次把目标聚焦在年轻人都喜欢的咖啡上。现在咖啡已经成为年轻一代的社交硬通货&#xff0c;咖啡店也遍地开花。而随着移动互联网的快速发展&#xff0c;咖啡店小程序已经成为了各大咖啡店主的选择&#xff0c;因为它提供了便捷的方式…

【Leetcode-面试经典150题-day22】

目录 97. 交错字符串 97. 交错字符串 题意&#xff1a; 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 …

便捷、快速、稳定、高性能!以 GPU 实例演示 Alibaba Cloud Linux 3 对 AI 生态的支持 | 龙蜥技术

编者按&#xff1a;日前&#xff0c;Alibaba Cloud Linux 3 为使 AI 开发体验更高效&#xff0c;提供了一些优化升级&#xff0c;本文为“Alibaba Cloud Linux 3 AI 能力介绍”系列文章预告篇&#xff0c;以 GPU 实例为例&#xff0c;为大家演示 Alibaba Cloud Linux 3 对 AI 生…

Vue + Element UI 前端篇(五):国际化实现

Vue Element UI 实现权限管理系统 前端篇&#xff08;五&#xff09;&#xff1a;国际化实现 国际化支持 1.安装依赖 执行以下命令&#xff0c;安装 i18n 依赖。 yarn add vue-i18n $ yarn add vue-i18n yarn add v1.9.4 warning package-lock.json found. Your project …

数据分析必知的统计知识——区间估计(其四)

4. 区间估计 还以为你被上节课的内容唬住了~终于等到你&#xff0c;还好没放弃&#xff01; 本节我们将说明两个问题&#xff1a;总体均值 μ \mu μ 的区间估计和总体比例 p ˉ \bar{p} pˉ​ 的区间估计。 区间估计经常用于质量控制领域来检测生产过程是否正常运行或者在…

机车整备场数字孪生 | 图扑智慧铁路

机车整备场是铁路运输系统中的重要组成部分&#xff0c;它承担着机车的维修、保养和整备工作&#xff0c;对保障铁路运输的运维和安全起着至关重要的作用。 随着铁路运输的发展、机车技术的不断进步&#xff0c;以及数字化转型的不断推进&#xff0c;数字孪生技术在机车整备场…

【Nginx23】Nginx学习:响应头与Map变量操作

Nginx学习&#xff1a;响应头与Map变量操作 响应头是非常重要的内容&#xff0c;浏览器或者客户端有很多东西可能都是根据响应头来进行判断操作的&#xff0c;比如说最典型的 Content-Type &#xff0c;之前我们也演示过&#xff0c;直接设置一个空的 types 然后指定默认的数据…

OPC UA Tunnel提高了OPC Classic通信的安全性

2023年8月22日&#xff0c;Softing工业自动化推出了dataFEED OPC Suite 5.30版本。该版本增加了两项新功能&#xff1a;OPC UA Tunnel和InfluxDB数据库连接。 &#xff08;OPC UA Tunnel提高了OPC Classic通信的安全性&#xff09; | OPC UA Tunnel——用于提高OPC Classic通信…

日志框架Slf4j作用及其实现原理

目录 1 设计模式门面模式2 slf4j源码解析 1 设计模式门面模式 设计模式之门面模式与装饰器模式详解和应用&#xff1a;https://blog.csdn.net/ZGL_cyy/article/details/129073521 slf4j是门面模式的典型应用&#xff0c;因此在讲slf4j前&#xff0c;我们先简单回顾一下门面模…

前端日期比较大小(超简单版,不需要转换时间戳)

思路&#xff08;把日期转换为Number类型进行比较&#xff09; 效果如图&#xff1a; 第一步&#xff1a;如果获取到的日期是 &#xff1a;"2023-08-03 00:00:00" 用 timesss.split( )[0] // .split( ) 中间有个空格哦 timesss是自己数据的变…

nlp系列(7)实体识别(Bert)pytorch

模型介绍 本项目是使用Bert模型来进行文本的实体识别。 Bert模型介绍可以查看这篇文章&#xff1a;nlp系列&#xff08;2&#xff09;文本分类&#xff08;Bert&#xff09;pytorch_bert文本分类_牧子川的博客-CSDN博客 模型结构 Bert模型的模型结构&#xff1a; 数据介绍 …

解决Android U无法通过adb安装应用(Caller has no access to session -1)的问题

在Android U&#xff08;14&#xff09;上&#xff0c;对通过adb安装应用做了限制。默认的情况下&#xff0c;当执行以下命令的时候 adb install XXX.apk会提示执行异常 Performing Streamed Install adb: failed to install XXX.apk: Exception occurred while executing in…

java面试之ThreadLocal问题

什么是ThreadLocal,它的基本用法是什么 简单来说就是能在多线程中保持变量独立的线程对象 不用Threadlocal多线程访问同一个变量会出现的问题 package com.pxx;/*** Created by Administrator on 2023/9/3.*/ public class Demo1 {private String v1;public String getV1() …

群晖 DS918通过CISCO SG250 LACP 链路聚合效果不佳的问题解决

问题表现 使用的是CISCO交换机打开LACP 链路聚合&#xff0c;且DS918上完成接口聚合并配置为平衡TCP模式后。通过IPREF测速整体网络性能仅能达到300Mbps左右。 问题解决 检查CISCO交换机LAG配置中&#xff0c;针对DS918的接口组是否正确配置了流量配置。请按照如下图所示&#…

易云维®医院后勤管理系统软件利用物联网智能网关帮助实现医院设备实现智能化、信息化管理

近年来&#xff0c;我国医院逐渐意识到医院设备信息化管理的重要性&#xff0c;逐步建立医院后勤管理系统软件&#xff0c;以提高信息化管理水平。该系统是利用数据库技术&#xff0c;为医院的中央空调、洁净空调、电梯、锅炉、医疗设备等建立电子档案&#xff0c;把设备监控、…

Python中的PYTHONPATH

迷途小书童 读完需要 4分钟 速读仅需 2 分钟 大家好&#xff0c;我是迷途小书童&#xff01; 今天来聊聊 PYTHONPATH。 PYTHONPATH 是一个环境变量&#xff0c;它是一个列表&#xff0c;列表的元素是目录&#xff0c;也就是一些文件夹的路径&#xff0c;它告诉 Python 解释器去…