项目前置
这是我之前写的关于Binder的一些知识点和使用基本数据类型在通信的文章,感兴趣的可以看一下: Binder(一)Binder的介绍和AIDL使用Binder的实例
项目目标
在两个APP之间进行数据传递,使用Android推荐的Binder通讯,而AIDL是Android推出的用来简化Binder写法的工具。
如果只是简短的使用java基本数据类型的话,只需要根据上面的那一篇文章对着来就可以了,这次我们需要使用我们自定义的数据bean来进行数据传递,而且是在实际项目中使用,就需要进行一些处理了。
项目需求
在这里为了区分,将接收数据的项目作为客户端,将发送数据的服务app作为服务端。服务端要获取外部数据,然后将这个数据通过Binder发送到客户端,客户端接收数据。
项目实现
服务端
首先我们要创建一个新的项目,然后在新的项目里面创建AIDL
创建AIDL
aidl
文件夹和java
文件夹同级,都在main
文件夹下面
创建完之后,会得到一个这样的文件
然后再java的同名,同级别文件下面创建一个数据bean文件
数据bean代码如下
public class CpServiceMsg implements Parcelable {
public int channel;
public int id;
public String data;
public CpServiceMsg(int channel, int id, String data) {
this.channel = channel;
this.id = id;
this.data = data;
}
public int getChannel() {
return channel;
}
public void setChannel(int channel) {
this.channel = channel;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
protected CpServiceMsg(Parcel in) {
channel = in.readInt();
id = in.readInt();
data = in.readString();
}
public static final Creator<CpServiceMsg> CREATOR = new Creator<CpServiceMsg>() {
@Override
public CpServiceMsg createFromParcel(Parcel in) {
return new CpServiceMsg(in);
}
@Override
public CpServiceMsg[] newArray(int size) {
return new CpServiceMsg[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(channel);
dest.writeInt(id);
dest.writeString(data);
}
@Override
public String toString() {
return "CpServiceMsg{" +
"channel=" + channel +
", id=" + id +
", data='" + data + '\'' +
'}';
}
}
注意:
1.这个数据bean要实现【Parcelable】接口
2.尽量不要用byte[]类型,因为如果是高版本和低版本软件进行通信的时候,低版本的没有读取byte[]数据的快捷方法。
接下来在aidl的相同的目录下创建这个
首先创建文件夹bean
然后创建文件【CpServiceMsg.aidl】
这两个文件是同名文件,而且他们的文件目录也是同样的,只是一个在aidl
里面,一个在java
文件夹里面而已,这个需要注意一下。
然后在【CpServiceMsg.aidl】文件里面添加
然后在这个【ICPService.aidl】文件里面添加方法
这样的话我们AIDL就写好了,然后需要【Build】一下项目。
这样Android Studio会自动帮我们生成相关代码,可以在这个地方查看
接下来我们需要使用这个AIDL
首先我创建一个服务类
然后为了方便可以在这个服务类里面创建类继承系统生成的aidl
然后在MyForegroundService类里面
然后
这样当客户端连接到这个服务端的时候,这个onBind
会调用,返回这个myBinderCpService
然后客户端调用这个getCanMsg
方法的时候,就会获得这个
还有,一定要记得在【AndroidManifest.xml】注册清单文件里面对这个服务类进行注册
客户端
客户端这边也要创建一个aidl文件,但是客户端的aidl文件不要自己写,要直接从服务端直接复制过来,不要改什么东西。
然后在这个java
文件夹下面创建同样的目录结构,当用在项目里面的时候,这个是肯定要做的,因为每个项目都有自己的目录结构,这就需要自己创建这个相关的目录结构,不然到时候aidl找不到文件
这个文件直接从服务端直接复制就好了。
然后需要进行【Build】一下,这样系统会创建项目的文件类。
在需要使用的地方,比如在一个【Activity】里面
然后创建一个【ServiceConnection】
然后就可以进行服务的绑定了
接下里就是使用了
然后就饿没什么了,启动服务端,启动客户端,进行数据通信了。