android auto通信错误,Android AIDL通信开发及遇到的问题

AIDL是Android的接口定义语言,用于实现进程间通信(IPC)。通过AIDL,开发者可以定义客户端和服务之间的接口,使得不同进程的对象能够相互通信。本文详细介绍了AIDL的使用步骤,包括创建接口文件、服务端实现、客户端连接服务等,并讨论了遇到的`SecurityException: Binder invocation to an incorrect interface`错误及其解决方案。
摘要由CSDN通过智能技术生成

AIDL 是什么

AIDL(Android 接口定义语言) 是 Android 提供的一种进程间通信 (IPC) 机制。

我们可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。

在 Android 上,一个进程通常无法访问另一个进程的内存。 尽管如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。

AIDL 支持的数据类型

Java 的基本数据类型

List 和 Map

元素必须是 AIDL 支持的数据类型

Server 端具体的类里则必须是 ArrayList 或者 HashMap

其他 AIDL 生成的接口

实现 Parcelable 的实体

AIDL 如何编写

创建 AIDL

创建要操作的实体类,实现 Parcelable 接口,以便序列化/反序列化

新建 aidl 文件夹,在其中创建接口 aidl 文件以及实体类的映射 aidl 文件

Make project ,生成 Binder 的 Java 文件

服务端

创建 Service,在其中创建上面生成的 Binder 对象实例,实现接口定义的方法

在 onBind() 中返回

客户端

实现 ServiceConnection 接口,在其中拿到 AIDL 类

bindService()

调用 AIDL 类中定义好的操作请求

根据以上创建一个简单的aidl跨进程demo

1、 创建接口 aidl 文件以及实体类的映射 aidl 文件(客户端和服务端须各一个AIDL接口文件所在的包必须相同)

IPerson.aidl(测试参考)

`interface IPerson {

void setValue(String name);

String getValue();

}`

2、 服务端创建一个service(必须一个Service类的配合)

MyService.java(测试参考)

public class MyService extends Service {

private IPerson.Stub iPerson = new Person();

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generated method stub

return iPerson;

}

}

manifest.java(测试参考)

android:exported="true">

3、 要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给bindService()

private ServiceConnection conn = new ServiceConnection() {

//连接对象

@Override

public void onServiceDisconnected(ComponentName name) {

// TODO Auto-generated method stub

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

// TODO Auto-generated method stub

iPerson = IPerson.Stub.asInterface(service);

if (iPerson != null) {

try {

iPerson.setValue("AIDL TEST");

} catch (RemoteException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

};

/*绑定*/

Intent intent = new Intent(MyActivity.this, MyService.class);

bindService(intent, conn, Service.BIND_AUTO_CREATE);

最近在研究Android通信,感觉aidl很有意思,拿来研究一下分享遇到的问题

1、实现AIDL远程服务调用,建立C/S端通信,建立两个demo,运行连接报如下错误,一脸方!!!

java.lang.SecurityException: Binder invocation to an incorrect interface这个错误

解决办法:

2ab9f5091f0a

image.png

2ab9f5091f0a

image.png

aidl 必须相同,相同是指不同项目下相同包名下aidl进行通信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值