Android Service:利用Binder通信中,传递自定义类型

Android Service:利用Binder通信中,传递自定义类型

AIDL中支持的数据类型

AIDL中支持的数据类型有:

支持类型 需要import 备注
Java基本类型 不需要import
String,
CharSequence,
List,
Map
不需要import List,Map内的元素必须是AIDL支持
的类型;
List接收方必须是ArrayList;
Map接收方必须是HashMap
其他AIDL定义的AIDL接口 需要import 传递的是引用
实现Parcelable的类 需要import 值传递

注意:在AIDL中定义函数参数时,如果参数时其他AIDL接口或者实现Parcelable的类时,需要参数前添加in、out、inout

in、out、inout被称为directional tag,代表参数的传递方向

AIDL中如何传递自定义类型

实现自定义类型,需要如下两步:

  1. 创建实现Parcelable的类;
  2. 创建该类型的aidl文件;

创建实现Parcelable接口的类

  1. 该类必须实现的Parcelable接口的writeToParcel(Parcel dest, int flags)方法,用于将数据写入parcel;
  2. 该类必须实现一个static的Parcelable.Creator变量,用于从parcel中读出数据;

说白了,就是一个将数据写入parcel,另一个将数据从parcel读出,parcel就是数据传输的载体。

下面看一下代码:

package com.example.aidltestservice;

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

public class TestType implements Parcelable {
    //class的数据
    private String mContent;

    //为了方便,添加从parcel生成对象的构造函数
    public TestType(Parcel source) {
        mContent = source.readString();
    }

    public TestType(String content) {
        mContent = content;
    }

    public String getContent() {
        return mContent;
    }

    //用默认实现即可
    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    //将数据写入Parcel,用于传输
    //必须实现
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub
        dest.writeString(mContent);
    }

    //将数据从Parcel读出
    //必须实现
    public static final Parcelable.Creator CREATOR = new  Parcelable.Creator() {
        @Override
        public TestType[] newArray(int size) {
            return new TestType[size];
        }

        //从parcel获得数据
        @Override
        public TestType createFromParcel(Parcel source) {
            return new TestType(source);
        }
    };
}

创建类的aidl文件

创建类的aidl文件,比较简单,只要在aidl里面简单的声明一下就可以了。

下面来看看代码:

package com.example.aidltestservice;
parcelable TestType;

应用自定义类型

应用自定义类型,和其他基本类型一致。当自定义类型作为参数时,需要主要前面加上in, out, inout。

下面来看看代码:

package com.example.aidltestservice;

//import自定义类型
import  com.example.aidltestservice.TestType;

interface IAIDLTestService{
    void sayHello();

    //TestType作为参数,前面加上in,代表参数方向
    String getContent(in TestType type);
}

详细代码结构

AIDL中传递其他AIDL定义的AIDL接口

下面是具体的例子,一起看看代码:

其他接口定义的AIDL接口

package com.aidl.test;

interface ICallbackListener{

    void onDataPosted(int data);
}   

在AIDL中使用AIDL接口

package com.aidl.test;

import com.aidl.test.ICallbackListener;

interface IAIDLTestService{

    String registerCallbackListener(in ICallbackListener listener);

    void unregisterCallbackListener(in ICallbackListener);

}

你可能感兴趣的:(Android,Service)