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

【Android】直接使用binder的transact来代替aidl接口

aidl提供了binder调用的封装,有的时候,比如:

1. 懒得使用aidl生成的接口文件(确实是懒,Android studio中aidl生成接口文件很方便)

2. 服务端的提供者只公开了部分接口出来,只给了调用编号和参数(这个设计就很奇怪,其实可以提供fake的aidl文件,暴露部分方法即可)

3. 想看看更直观的binder通信的调用

可以使用transcat调用,以下是直观的一个例子

		try {
//获取服务,可以使用反射来实现IBinder aProxyBinder = (IBinder)getSystemService("lam");//atestif (aProxyBinder != null){Log.d(TAG, "lam not null");}	    		else {Log.d(TAG, "lam is null");}Parcel dataParcel = Parcel.obtain(); Parcel resultParcel = Parcel.obtain();dataParcel.writeInterfaceToken(DESCRIPTOR);//发起请求	 aProxyBinder.transact(3, dataParcel, resultParcel, 0);

在 Android 中,直接使用 Binder 的 transact 方法来调用 Binder 接口是一种底层的方法,通常用于自定义的 IPC(进程间通信)场景。这种方式绕过了 AIDL 自动生成的代码,允许你手动进行跨进程调用。下面将介绍如何直接使用 transact 方法来调用 Binder 接口。

1. 理解 transact 方法

transact 方法是 IBinder 类中的一个关键方法,它用于执行跨进程请求。其原型如下:

public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException;
  • code: 请求码,标识要调用的具体方法。
  • data: 输入参数,封装在 Parcel 对象中。
  • reply: 输出结果,同样封装在 Parcel 对象中。
  • flags: 标志位,控制事务的行为(如 FLAG_ONEWAY 表示异步调用)。

2. 定义和实现 Binder 接口

首先,你需要定义一个接口,并提供相应的服务端实现。这个过程可以通过 AIDL 来完成,但为了演示如何直接使用 transact,我们将不使用 AIDL 自动生成的 stub 类。

假设我们有一个简单的服务接口 IMyService,它包含一个名为 doSomething 的方法,该方法接受一个字符串作为输入,并返回一个字符串作为输出。

2.1 服务端实现
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;public class MyService extends Binder {private static final int TRANSACTION_DO_SOMETHING = IBinder.FIRST_CALL_TRANSACTION + 0;@Overrideprotected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {if (code == TRANSACTION_DO_SOMETHING) {data.enforceInterface("com.example.IMyService");String input = data.readString();String output = doSomething(input);reply.writeInterfaceToken("com.example.IMyService");reply.writeString(output);return true;}return super.onTransact(code, data, reply, flags);}public String doSomething(String input) {// 实现你的业务逻辑return "Hello, " + input;}
}

在这个例子中,我们重写了 onTransact 方法,并根据传入的 code 来处理不同的请求。对于 TRANSACTION_DO_SOMETHING 请求,我们从 Parcel 中读取输入数据,调用 doSomething 方法处理数据,然后将结果写回到 reply 中。

2.2 客户端调用

接下来,我们需要编写客户端代码来使用 transact 方法调用 doSomething 方法。

import android.os.Binder;
import android.os.Parcel;
import android.os.RemoteException;public class MyClient {private IBinder binder;public MyClient(IBinder binder) {this.binder = binder;}public String callDoSomething(String input) throws RemoteException {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();try {data.writeInterfaceToken("com.example.IMyService");data.writeString(input);// 调用 transact 方法boolean result = binder.transact(MyService.TRANSACTION_DO_SOMETHING, data, reply, 0);if (result) {// 读取回复数据reply.readException(); // 检查是否有异常抛出return reply.readString();} else {throw new RemoteException("Transaction failed.");}} finally {data.recycle();reply.recycle();}}
}

在这个例子中,我们创建了两个 Parcel 对象:datareply。我们使用 writeInterfaceToken 方法为 data 写入接口令牌,然后写入方法参数。接着,我们调用 transact 方法发送请求,并通过 reply 读取响应数据。最后,不要忘记回收 Parcel 对象以释放资源。

3. 注意事项

  • 错误处理:在调用 transact 方法时,务必检查返回值并处理可能的异常。例如,可以使用 reply.readException() 来检查服务器是否抛出了异常。

相关文章:

【Android】直接使用binder的transact来代替aidl接口

aidl提供了binder调用的封装,有的时候,比如: 1. 懒得使用aidl生成的接口文件(确实是懒,Android studio中aidl生成接口文件很方便) 2. 服务端的提供者只公开了部分接口出来,只给了调用编号和参…...

Python机器学习笔记(十八、交互特征与多项式特征)

添加原始数据的交互特征(interaction feature)和多项式特征(polynomial feature)可以丰富特征表示,特别是对于线性模型。这种特征工程可以用统计建模和许多实际的机器学习应用中。 上一次学习:线性模型对w…...

《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)

章节文章名备注第1节Spring Boot(1)基于Eclipse搭建Spring Boot开发环境环境搭建第2节Spring Boot(2)解决Maven下载依赖缓慢的问题给火车头提提速第3节Spring Boot(3)教你手工搭建Spring Boot项目纯手工玩法…...

【AI进化论】 如何让AI帮我们写一个项目系列:将Mysql生成md文档

一、python脚本 下面给出一个简易 Python 脚本示例,演示如何自动获取所有表的结构,并生成一份 Markdown 文件。你可根据自己的需求做修改或使用其他编程语言。 import mysql.connector# ------------------------ # 1. 连接数据库 # -----------------…...

(已开源-AAAI25) RCTrans:雷达相机融合3D目标检测模型

在雷达相机融合三维目标检测中,雷达点云稀疏、噪声较大,在相机雷达融合过程中提出了很多挑战。为了解决这个问题,我们引入了一种新的基于query的检测方法 Radar-Camera Transformer (RCTrans)。具体来说: 首先设计了一个雷达稠密…...

Elasticsearch:在 HNSW 中提前终止以实现更快的近似 KNN 搜索

作者:来自 Elastic Tommaso Teofili 了解如何使用智能提前终止策略让 HNSW 加快 KNN 搜索速度。 在高维空间中高效地找到最近邻的挑战是向量搜索中最重要的挑战之一,特别是当数据集规模增长时。正如我们之前的博客文章中所讨论的,当数据集规模…...

unittest VS pytest

以下是 unittest 和 pytest 框架的对比表格: 特性unittestpytest设计理念基于类的设计,类似于 Java 的 JUnit更简洁,基于函数式编程设计,支持类和函数两种方式测试编写需要继承 unittest.TestCase 类,方法以 test_ 开…...

Tableau数据可视化与仪表盘搭建-基础图表制作

目录 对比分析:比大小 柱状图 条形图 数据钻取 筛选器 热力图 气泡图 变化分析:看趋势 折线图 预测 面积图 关系分布:看位置 散点图 直方图 地图 构成分析:看占比 饼图 树地图 堆积图 对比分析:比大…...

Center Loss 和 ArcFace Loss 笔记

一、Center Loss 1. 定义 Center Loss 旨在最小化类内特征的离散程度,通过约束样本特征与其类别中心之间的距离,提高类内特征的聚合性。 2. 公式 对于样本 xi​ 和其类别yi​,Center Loss 的公式为: xi​: 当前样本的特征向量&…...

3125: 【入门】求1/1+1/2+2/3+3/5+5/8+8/13+13/21……的前n项的和

文章目录 题目描述输入输出样例输入样例输出 题目描述 求1/11/22/33/55/88/1313/2121/34……的前n项的和。 输入 第1行&#xff1a;一个整数n&#xff08;1 < n < 30 &#xff09;。 输出 一行&#xff1a;一个小数&#xff0c;即前n项之和&#xff08;保留3位小数&…...

如何确保获取的淘宝详情页数据的准确性和时效性?

要确保获取的淘宝详情页数据的准确性和时效性&#xff0c;可从以下几个方面着手&#xff1a; 合法合规获取数据 遵守平台规则&#xff1a;在获取淘宝详情页数据之前&#xff0c;务必仔细阅读并严格遵守淘宝平台的使用协议和相关规定。明确哪些数据可以获取、以何种方式获取以及…...

云计算是如何帮助企业实现高可用性的

想象一下&#xff0c;你正在享受一个悠闲的周末&#xff0c;突然接到同事的电话&#xff1a;公司的核心系统宕机了&#xff01;这个场景对很多IT从业者来说并不陌生。但在云计算时代&#xff0c;这样的噩梦正在逐渐远去。 一位前辈告诉我&#xff1a;"在技术世界里&#…...

143.《python中使用pymongo》

文章目录 pymongo安装pymongo连接数据库mongodb操作创建数据库判断数据库是否存在创建集合判断集合是否已经存在插入集合插入一条多条插入 查询数据查询一条数据查询所有数据查询指定字段的数据统计查询统计所有记录数按条件统计记录数分页列表查询比较查询$eq$gt$gte$in$lt$lt…...

Babylon.js 的 Mesh 与 Unity 的 GameObject:深入对比与分析

在 3D 开发领域&#xff0c;Babylon.js 和 Unity 是两款极具影响力的引擎&#xff0c;分别在 Web 平台和游戏开发领域占据重要地位。要深入理解这两款引擎的异同&#xff0c;从其核心对象——Babylon.js 的 Mesh 和 Unity 的 GameObject ——入手进行对比&#xff0c;是…...

MySQL安装,配置教程

一、Linux在线yum仓库安装 打开MySQL官方首页&#xff0c;链接为&#xff1a;https://www.mysql.com/ 界面如下&#xff1a; 在该页面中找到【DOWNOADS】选项卡&#xff0c;点击进入下载页面。 在下载界面中&#xff0c;可以看到不同版本的下载链接&#xff0c;这里选择【My…...

Android折叠屏适配(权宜之计)

现在折叠屏手机出了也有一段时间了&#xff0c;但是除了大厂app&#xff0c;其他app适配折叠屏还是比较少&#xff0c;如果真的想做好折叠屏完全适配&#xff0c;那这个文章可能并不适合&#xff0c;这里只是一个简单适配的思路。 如果原先你的app已经适配了平板&#xff0c;那…...

Spark是什么?Flink和Spark区别

Spark是什么&#xff1f;Flink和Spark区别 一、Spark二、Spark和Flink区别三、总结 一、Spark Apache Spark 是一个开源的大数据处理框架&#xff0c;主要用于大规模数据处理和分析。它支持多种数据处理模式&#xff0c;包括批处理、流处理、SQL 查询、机器学习和图处理等。 核…...

Cocos Creator 3.8 修改纹理像素值

修改的代码&#xff1a; import { _decorator, Component, RenderTexture, Sprite, Texture2D, ImageAsset, SpriteFrame, Vec2, gfx, director, log, math, v2 } from cc;const { ccclass, property } _decorator;ccclass(GradientTransparency) export class GradientTrans…...

如何评价deepseek-V3 VS OpenAI o1 自然语言处理成Sql的能力

DeepSeek-V3 介绍 在目前大模型主流榜单中&#xff0c;DeepSeek-V3 在开源模型中位列榜首&#xff0c;与世界上最先进的闭源模型不分伯仲。 准备工作&#xff1a; 笔者只演示实例o1 VS DeepSeek-V3两个模型&#xff0c;大家可以自行验证结果或者实验更多场景&#xff0c;同时…...

SQL左连接的两种不同情况示例和外连接示例

Oracle&#xff1b;有2个表如下&#xff1b; 执行下图选中的左连接&#xff1b; 左表10条记录&#xff0c;右表3条记录&#xff0c;结果是10条记录&#xff1b; 执行下图的左连接&#xff0c; 老师表为左表&#xff0c;学生表为右表&#xff0c;结果会显示每个老师&#xff0c…...

【机器人】ROS2配置solidworks模型转换的URDF文件

&#x1f647;‍♀ 安装solidworks_urdf插件 地址 在添加过点和坐标系后&#xff0c;点击工具->tools(在最下面) 如何转为URDF请看这个视频点击 ☕ 为ROS2配置 安装相关依赖 sudo apt install ros-humble-joint-state-publisher-gui sudo apt install ros-humble-xacro…...

2026年花洒产品推荐:四款热门花洒横评,闭眼入不踩雷

其实选花洒不用盲目追大牌&#xff0c;核心看体验、看品质、看适配性。今天就带来四款热门花洒的深度横评&#xff0c;涵盖瑞尔特、飞利浦、小米米家、九牧四大主流品牌&#xff0c;每款都结合真实使用体验拆解&#xff0c;不罗列参数、不夸大宣传&#xff0c;让每天的沐浴都能…...

UE5地牢生成实战:从零搭建程序化地下城(附完整蓝图逻辑)

UE5地牢生成实战&#xff1a;从零搭建程序化地下城&#xff08;附完整蓝图逻辑&#xff09; 在游戏开发中&#xff0c;程序化内容生成(PCG)技术正变得越来越重要。想象一下&#xff0c;你正在开发一款Roguelike游戏&#xff0c;每次玩家进入地牢都能获得全新的探索体验——这正…...

西交提出 OdysseyArena:让智能体真正“学会探索”的长程归纳推理基准

&#x1f4cc; 一句话总结&#xff1a; 本工作提出 OdysseyArena&#xff0c;一个面向长时程&#xff08;long-horizon&#xff09;、主动探索&#xff08;active&#xff09;、归纳学习&#xff08;inductive&#xff09;三大核心能力的交互式评测平台&#xff0c;系统性检验…...

17.在 React 中如何根据条件决定渲染哪个组件?

在 React 里&#xff0c;组件不是一上来就“全给你渲染出来”的。 很多时候&#xff0c;我们希望&#xff1a;界面要看情况说话——登录了看“欢迎回来”没登录就看“请先登录”加载中只给你个转圈圈请求失败再丢个错误提示这些“根据条件&#xff0c;决定渲染什么”的行为&…...

Rancher国内网络卡脖子?手把手教你配置私有镜像仓库(避坑RKE2 registries.yaml)

Rancher国内网络优化实战&#xff1a;私有镜像仓库配置全指南 引言 对于国内Kubernetes从业者来说&#xff0c;Rancher无疑是一款强大的集群管理工具。但在实际部署过程中&#xff0c;许多团队都遇到过因网络问题导致镜像拉取失败的困扰。想象一下&#xff0c;当你正准备部署一…...

云效流水线+K8s实战:Java微服务全自动部署与优化指南(手把手版)

1. 云效流水线入门&#xff1a;从零搭建Java微服务CI/CD管道 第一次接触云效流水线时&#xff0c;我像发现新大陆一样兴奋——原来部署可以这么简单&#xff01;记得去年团队还在用Jenkins手动打包部署&#xff0c;每次发版都要折腾到凌晨。现在用云效 K8s的组合&#xff0c;我…...

SEO 关键字和内容创作有什么关系

SEO 关键字和内容创作有什么关系 在数字营销和网络推广领域&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是提升网站流量的核心策略之一。而在SEO中&#xff0c;关键词的作用至关重要。SEO关键字和内容创作有什么关系呢&#xff1f;这不仅是一个技术问题&#xff0c;更…...

手把手教你用JoyAgent-JDGenie搭建自己的第一个AI智能体(附天气查询Agent代码)

手把手教你用JoyAgent-JDGenie搭建自己的第一个AI智能体&#xff08;附天气查询Agent代码&#xff09; 想象一下&#xff0c;你刚接触多智能体框架&#xff0c;面对复杂的系统架构和抽象概念&#xff0c;是不是有种无从下手的感觉&#xff1f;今天我们就用JoyAgent-JDGenie这个…...

当“过杀率”飙升时,现场工程师该如何向AI“施压”?

产线正在满负荷运转&#xff0c;AI智能体视觉检测系统&#xff08;TVA&#xff09;突然开始把大量合格的螺母件剔除。操作工抱怨连连&#xff0c;生产厂长在后面催。你打电话给供应商&#xff0c;对方说“回去调一下模型&#xff0c;明天发版”。这一等就是一天&#xff0c;产线…...