AIDL 传递对象,客户端服务端相互调用笔记记录
AIDL 支持传递的数据类型
- Java八种基本数据类型(int、char、boolean、double、float、byte、long) 但不支持short.
- String、CharSequence.
- List和Map. ( List,Map内的元素必须是AIDL支持 List接收端必须是ArrayList,Map接收端必须是HashMap)
- 其他AIDL定义的AIDL接口 (需要import)
- 实现Parcelable的类(需要import)
1.定义IMyAidlInterface.aidl文件,这里俩个方法分别用于传递对象和添加回调
package com.example;
import com.example.IListener;
import com.example.TestBean;
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void send(String name,IListener iListener);
TestBean getBean();
}
2.定义TestBean.java
package com.example;
import android.os.Parcel;
import android.os.Parcelable;
public class TestBean implements Parcelable {
private String name;
public TestBean(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "name:" + name;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
}
public void readFromParcel(Parcel dest) {
name = dest.readString();
}
protected TestBean(Parcel in) {
this.name = in.readString();
}
public static final Creator<TestBean> CREATOR = new Creator<TestBean>() {
@Override
public TestBean createFromParcel(Parcel source) {
return new TestBean(source);
}
@Override
public TestBean[] newArray(int size) {
return new TestBean[size];
}
};
}
3.必须在TestBean同目录下定义TestBean.aidl文件,格式如下
// TestBean.aidl
package com.example;
// Declare any non-default types here with import statements
parcelable TestBean;
4.定义回调接口IListener.aidl文件
// IListener.aidl
package com.example;
// Declare any non-default types here with import statements
interface IListener {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void onSuccess(int code);
}
5.build项目就会自动生成IMyAidlInterface.Stub 的IBinder类型文件
6.在ervice的onBind方法中返回 IMyAidlInterface.Stub的IBinder类型对象
public class TestService extends Service {
private static final String TAG = "TestService";
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "onBind");
return new IMyAidlInterface.Stub() {
@Override
public void send(String name, IListener iListener) throws RemoteException {
}
@Override
public TestBean getBean() throws RemoteException {
return null;
}
};
}
客户端实现,把服务端的文件拷贝到客户端相同的包下,build一下就会生成和服务端一样的IBinder对象
客户端调用IBinder的sender方法,传入IListener 对象,就可以接收来自服务端的回调