Android---45---使用AIDL Service傳遞複雜資料,androidserviceaidl

來源:互聯網
上載者:User

Android---45---使用AIDL Service傳遞複雜資料,androidserviceaidl


該執行個體所傳輸的資料類型是自訂類型。


Android 要求調用遠程Service的參數和返回值都需要實現Parcelable介面。


實現Parcelable介面相當於Android提供的一種自訂序列化機制。


實現Parcelable介面不僅要求實現該介面裡定義的方法,而且要求在實作類別中定義一個名為CREATOR
類型為Parcelable.Creator的靜態Filed。除此之外,還要求使用AIDL代碼來定義這些自訂類型。



服務端:

自訂兩個類型:Person與Pet,其中Person對象作為調用遠程Service的參數,而Pet將作為返回值。

Person 和 Pet類都必須實現 Parcelable介面,並在實作類別中定義一個名為CREATOR的靜態Filed。


要定義Person類,先要AIDL來定義Person類:


parcelable Person;

接下來定義Person實現Parcelable的類


public class Person implements Parcelable {private Integer id;private String name;private String pass;public Person() {super();// TODO Auto-generated constructor stub}public Person(Integer idInteger, String name, String pass) {super();this.id = idInteger;this.name = name;this.pass = pass;}public Integer getIdInteger() {return id;}public void setIdInteger(Integer idInteger) {this.id = idInteger;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPass() {return pass;}public void setPass(String pass) {this.pass = pass;}@Overridepublic int hashCode() {// TODO Auto-generated method stubfinal int prime = 31;int result = 1;result = prime * result + ((name == null) ? 0 : name.hashCode());result = prime * result + ((pass == null) ? 0 : pass.hashCode());return result;}@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null) {return false;}if (getClass() != o.getClass()) {return false;}Person other = (Person) o;if (name == null) {if (other.name != null) {return false;}} else if (!name.equals(other.name)) {return false;}if (pass == null) {if (other.pass != null) {return false;}} else if (!pass.equals(other.pass)) {return false;}return true;}// 實現Parcelable必須要實現的方法@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {// 把該對象所包含的資料寫到Parceldest.writeInt(id);dest.writeString(name);dest.writeString(pass);}public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {@Overridepublic Person createFromParcel(Parcel source) {// 從Parcel中讀取資料,返回Person對象return new Person(source.readInt(), source.readString(),source.readString());}@Overridepublic Person[] newArray(int size) {// TODO Auto-generated method stubreturn new Person[size];}};}


然後是Pet類,也是先定義AIDL中的Pet:

parcelable Pet; 



然後是定義Pet類實現Parcelable:


public class Pet implements Parcelable {private String name;private double weight;public Pet(String name, double weight) {super();this.name = name;this.weight = weight;}public Pet() {super();// TODO Auto-generated constructor stub}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}@Overridepublic int describeContents() {// TODO Auto-generated method stubreturn 0;}@Overridepublic String toString() {return "Pet [name=" + name + ", weight=" + weight + "]";}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);dest.writeDouble(weight);}// 添加一個靜態成員,名為CREATOR,該對象實現了Parcelable.Creator介面public static final Parcelable.Creator<Pet> CREATOR = new Parcelable.Creator<Pet>() {@Overridepublic Pet createFromParcel(Parcel source) {// 從Parcel中讀取資料,返回Pet對象return new Pet(source.readString(), source.readDouble());}@Overridepublic Pet[] newArray(int size) {return new Pet[size];}};}


有了Person和Pet自訂的類,接下來就要定義用於通訊的介面了:IPet


還是先是AIDL中定義:


package com.example.complexaidlservice;import com.example.complexaidlservice.Pet;import com.example.complexaidlservice.Person;//定義一個Person對象作為傳入對象interface IPet{List<Pet> getPets (in Person owner );}


接下來就是開發Service類了:


public class ComplexService extends Service {private PetBinder petBinder;private static Map<Person, List<Pet>> pets = new HashMap<Person, List<Pet>>();static {ArrayList<Pet> list1 = new ArrayList<Pet>();list1.add(new Pet("旺財", 4.3));list1.add(new Pet("來福", 5.4));pets.put(new Person(1, "sun", "sun"), list1);ArrayList<Pet> list2 = new ArrayList<Pet>();list2.add(new Pet("Kitty", 2.3));list2.add(new Pet("garfiled", 3.1));pets.put(new Person(2, "bai", "bai"), list2);}@Overridepublic void onCreate() {super.onCreate();petBinder = new PetBinder();}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn petBinder;}// 繼承Stub,也就是實現了IPet介面,並實現了IBinder介面public class PetBinder extends Stub {@Overridepublic List<Pet> getPets(Person owner) throws RemoteException {// TODO Auto-generated method stubreturn pets.get(owner);}}@Overridepublic void onDestroy() {}}




接下來該寫用戶端的代碼了:

還記得在上一篇中寫到的,需要把服務端的AIDL介面複製過來,傳遞複雜資料的時候,不僅僅只將IPet複製過來
同時也要將 Person.java,Person.aidl Pet.aidl,Pet.java 一起複製到用戶端。

還是按照之前綁定遠程Service的方式即可,並在ServiceConnection實作類別的onServiceConnected方法中
擷取遠程Service的onBind方法返回的代理對象即可。



public class ComplexClient extends Activity {private IPet petService;private Button get;EditText personView;ListView showView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);personView = (EditText) findViewById(R.id.person);showView = (ListView) findViewById(R.id.show);get = (Button) findViewById(R.id.get);Intent intent = new Intent();intent.setAction("com.example.complexaidlservice.COMPLEXSERVICE");// 綁定遠程ServicebindService(intent, conn, Service.BIND_AUTO_CREATE);get.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {try {String personName = personView.getText().toString();// 調用遠程Service的方法List<Pet> pets = petService.getPets(new Person(1,personName, personName));// 將程式返回的List封裝成ArrayAdapterpterArrayAdapter<Pet> adapter = new ArrayAdapter<>(ComplexClient.this,android.R.layout.simple_list_item_1, pets);showView.setAdapter(adapter);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();this.unbindService(conn);}private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 擷取遠程Service的onBind方法返回的對象的代理petService = IPet.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubpetService = null;}};}










聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.