在AIDL接口中除了可以使用java自帶的數據類型外,還可以使用自定義的數據類型。如果需要使用自定義數據類型或List,Map中需要封裝自定義數據類型需要以下幾個步驟:
1.自定義的數據類型實現Pracelable接口。
2.編寫自定義數據類型的.aidl文件
3.無論自定義數據類型與aidl接口源文件是否在一個包中,在接口源文件中使用自定義數據類型時都需要顯示的import語句導入。
4.將自定義數據類型的,java文件和.aidl文件複製到客戶端
自定義數據類型的.aidl文件需要滿足:
1.存在與自定義數據類型.java文件相同的package語句
2.parcelable 自定義數據類型的類名
Pracelable接口
package com.wanghongxiang.customdatatypeservice;
public class Student implements Parcelable {
private String name;
private String from;
private int age;
public static final Parcelable.Creator<Student> CREATOR=new Parcelable.Creator<Student>(){
@Override
public Student createFromParcel(Parcel source) {
return new Student(source);
}
@Override
public Student[] newArray(int size) {
return new Student[size];
}};
//自定義構造方法
public Student(Parcel source) {
readFromParcel(source);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(from);
dest.writeInt(age);
}
//從Parcel容器中讀出數據
private void readFromParcel(Parcel from){
this.name=from.readString();
this.from =from.readString();
this.age=from.readInt();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, String from, int age) {
super();
this.name = name;
this.from = from;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", from=" + from + ", age=" + age
+ "]";
}
}
Student.aidl
package com.wanghongxiang.customdatatypeservice;
parcelable Student;
StudentService.javapublic class StudentService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new InnerBinder();
}
private class InnerBinder extends IStudentAIDL.Stub{
@Override
public List<Student> getStudentList() throws RemoteException {
List<Student> list=new ArrayList<Student>();
list.add(new Student("rose","beijing",18));
list.add(new Student("jack","nanjing",18));
list.add(new Student("laowang","xian",18));
return list;
}
}
}
AndroidManifest.xml中添加如下代碼:<service android:name=".StudentService">
<intent-filter>
<action android:name="android.intent.action.STUDENT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
客戶端代碼:public class MainActivity extends Activity {
private ServiceConnection conn;
private IStudentAIDL studentService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
conn=new InnerServiceConnection();
Intent intent=new Intent("android.intent.action.STUDENT");
bindService(intent, conn,BIND_AUTO_CREATE);
}
private class InnerServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
studentService=IStudentAIDL.Stub.asInterface(service);
try {
List<Student> list=studentService.getStudentList();
for(Student s:list){
Log.d("",s.toString());
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
}