binder通信实现

kotlin实现参考链接

原理说明参考链接

本文为Java实现,基本流程与参考链接一致,代码和可运行的APK文件在github文件夹

service端

目录结构

service端实际架构如下(与android studio中的目录显示不太一样)

aidl是Android 接口定义语言,定义数据接口

在这里插入图片描述

通过android studio的build功能,可以自动生成IMyAidlInterface.aidl的java接口实现,位置在:

在这里插入图片描述

service端需要实现aidl中定义的RequestData类和ResponseData类,以及MyService类调用IMyAidlInterface.Stub对象的asBinder方法

在这里插入图片描述

aidl文件

RequestData.aidl

parcelable定义了binder在用户空间使用的数据模型

package com.example.appbinder;

parcelable RequestData;
ResponseData.aidl
package com.example.appbinder;

parcelable ResponseData;
IMyAidlInterface.aidl

interface定义了一个binder service,在编译中aidl会自动生成两类binder对象:

  • Stub类继承了Binder,应该在服务端实现
  • Proxy类应该在客户端实现

interface中函数的参数

  • 可以是原始类型、parcelable、Binder对象
  • 可以通过in、out、inout来修饰
    • in表示参数中的数据只从客户端移动到服务端,服务端只接收其中的数据不做更改
    • out则是相反的情况,在客户端给服务端发消息时,该参数只是一个占位符,不会被序列化;在服务端返回消息时,该占位符才会被初始化
    • inout是两者的结合
package com.example.appbinder;
import com.example.appbinder.RequestData;
import com.example.appbinder.ResponseData;

interface IMyAidlInterface {
   
    ResponseData send(in RequestData  request);
}

aidl文件编译

配置app的build.gradle

在这里插入图片描述

直接编译,在刚才的位置可以找到生成的IMyAidlInterface.java文件

java文件

RequestData.java

实现Parcelable接口,有一个字符串作为私有变量,一个toString函数来打印RequestData类数据

package com.example.appbinder;

import android.os.Parcel;
import android.os.Parcelable;

import static android.os.UserHandle.readFromParcel;

public class RequestData implements Parcelable {
   

    private String s;

    protected RequestData(Parcel in) {
   
        readFromParcel(in);
    }

    public RequestData(String s) {
   
        this.s = s;
    }

    /** 将数据写入到Parcel **/
    @Override
    public void writeToParcel(Parcel dest, int flags) {
   
        dest.writeString(s);
    }

    /** 从Parcel中读取数据 **/
    public void readFromParcel(Parcel in){
   
        s = in.readString();
    }

    @Override
    public int describeContents() {
   
        return 0;
    }

    public static final Creator<RequestData> CREATOR = new Creator<RequestData>() {
   
        @Override
        public RequestData createFromParcel(Parcel in) {
   
            return new RequestData(in);
        }

        @Override
        public RequestData[] newArray(int size) {
   
            return new RequestData[size];
        }
    };

    @Override
    public String toString() {
   
        return s;
    }
}
ResponseData.java
package com.example.appbinder;

import android.os.Parcel;
import android.os.Parcelable;

public class ResponseData implements Parcelable {
   

    private String s;

    protected ResponseData
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值