AIDL接口自定義數據類型及Pracelable接口

在AIDL接口中除了可以使用java自帶的數據類型外,還可以使用自定義的數據類型。如果需要使用自定義數據類型或List,Map中需要封裝自定義數據類型需要以下幾個步驟:

1.自定義的數據類型實現Pracelable接口。

2.編寫自定義數據類型的.aidl文件

3.無論自定義數據類型與aidl接口源文件是否在一個包中,在接口源文件中使用自定義數據類型時都需要顯示的import語句導入

4.將自定義數據類型的,java文件和.aidl文件複製到客戶端

自定義數據類型的.aidl文件需要滿足:

1.存在與自定義數據類型.java文件相同的package語句

2.parcelable  自定義數據類型的類名

Pracelable接口


         任何複合數據類型都是基本類型封裝後的集合,因此各種複合數據類型都可以被拆分爲基本數據類型再進行傳輸。比如我們定義一個Student類,有id,name等在傳輸時是以int,String的集合這樣的形式。Pracelable接口約定了數據被序列化傳輸的方式(Android的研發團隊認爲JAVA體系中的jjava.io.Serializable在序列化類的成員時效率偏低,不適合性能比較低的移動設備。因此研發了Pracelable並要求顯式的序列化類的成員以提高效率)
在Pracelable中定義了以下抽象方法:
public int describeContents():內容接口的描述,通常直接返回0即可
public void writeToParcel(Parcel dest, int flags):用於將當前類的成員寫入到Parcel容器中,重寫該方法時調用Parcel類的write系列方法即可。如writeInt(),writeString()等。
通常我們需要自定義readFromParcel(Parcel parcel)方法,用於從Parcel容器中讀出數據,讀出的順序必須與寫入時的順序一致
我們還必須創建靜態常量CREATOR,實現Parcelable.Creator<T>接口。常量名必須爲CREATOR,且必須用public static final修飾。然後重寫接口中的抽象方法。其中createFromParcel(Parcel source):這個方法用於從Parcel 容器返回泛型指定的類對象。需要我們自定義構造方法。
接下來用一個例子來說明。在服務端返回List的Student集合在客戶端調用


服務端代碼:
Student.java
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.java

public 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>
客戶端代碼:
MainActivity.java
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();
	}

}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章