Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android進程間傳遞自定義類型參數實現Parcelable接口

Android進程間傳遞自定義類型參數實現Parcelable接口

編輯:關於Android編程

Aidl默認支持的類型包話java基本類型(int、long、boolean等)和(String、List、Map、CharSequence),如果要傳遞自定義的類型該如何實現呢? 要傳遞自定義類型,首先要讓自定義類型支持parcelable協議,實現步驟如下: 1>自定義類型必須實現Parcelable接口,並且實現Parcelable接口的public void writeToParcel(Parceldest, intflags)方法 。 2>自定義類型中必須含有一個名稱為CREATOR的靜態成員,該成員對象要求實現Parcelable.Creator接口及其方法。 3> 創建一個aidl文件聲明你的自定義類型。 Parcelable接口的作用:實現了Parcelable接口的實例可以將自身的狀態信息(狀態信息通常指的是各成員變量的值)寫入Parcel,也可以從Parcel中恢復其狀態。Parcel用來完成數據的序列化傳遞。 進程間傳遞自定義類型的實現過程見下方: 1> 創建自定義類型,並實現Parcelable接口,使其支持parcelable協議。如:在cn.itcast.domain包下創建Person.java: [java]  package cn.itcast.domain;   import android.os.Parcel;   import android.os.Parcelable;   public class Person implements Parcelable       private Integer id;       private String name;              public Person(){}       public Person(Integer id, String name) {           this.id = id;           this.name = name;       }       public Integer getId() {           return id;       }       public void setId(Integer id) {           this.id = id;       }       public String getName() {           return name;       }       public void setName(String name) {           this.name = name;       }          @Override       public int describeContents() {           return 0;       }       @Override       public void writeToParcel(Parcel dest, int flags) {//把javanbean中的數據寫到Parcel           dest.writeInt(this.id);           dest.writeString(this.name);       }       //添加一個靜態成員,名為CREATOR,該對象實現了Parcelable.Creator接口       public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){           @Override           public Person createFromParcel(Parcel source) {//從Parcel中讀取數據,返回person對象               return new Person(source.readInt(), source.readString());           }           @Override           public Person[] newArray(int size) {               return new Person[size];           }       };   }     2> 在自定義類型所在包下創建一個aidl文件對自定義類型進行聲明,文件的名稱與自定義類型同名。 package cn.itcast.domain; parcelable Person; 3> 在接口aidl文件中使用自定義類型,需要使用import顯式導入,本例在cn.itcast.aidl包下創建IPersonService.aidl文件,內容如下: package cn.itcast.aidl; import cn.itcast.domain.Person; interface IPersonService {       void save(in Person person); } 4> 在實現aidl文件生成的接口(本例是IPersonService),但並非直接實現接口,而是通過繼承接口的Stub來實現(Stub抽象類內部實現了aidl接口),並且實現接口方法的代碼。內容如下: public class ServiceBinder extendsIPersonService.Stub {        @Override        public void save(Person person) throwsRemoteException {   Log.i("PersonService",person.getId()+"="+ person.getName());        }  } 5> 創建一個Service(服務),在服務的onBind(Intentintent)方法中返回實現了aidl接口的對象(本例是ServiceBinder)。內容如下: [java]   public class PersonService extends Service {       private ServiceBinder serviceBinder = new ServiceBinder();       @Override       public IBinder onBind(Intent intent) {           return serviceBinder;       }   public class ServiceBinder extends IPersonService.Stub {          @Override          public void save(Person person) throws RemoteException {       Log.i("PersonService", person.getId()+"="+ person.getName());          }   }   }     其他應用可以通過隱式意圖訪問服務,意圖的動作可以自定義,AndroidManifest.xml配置代碼如下: <serviceandroid:name=".PersonService" >   <intent-filter>   <actionandroid:name="cn.itcast.process.aidl.PersonService " />   </intent-filter> </service> 6> 把應用中的aidl文件和所在package一起拷貝到客戶端應用的src目錄下,eclipse會自動在客戶端應用的gen目錄中為aidl文件同步生成IPersonService.java接口文件,接下來再把自定義類型文件和類型聲明aidl文件及所在package一起拷貝到客戶端應用的src目錄下。 最後就可以在客戶端應用中實現與遠程服務的通信,代碼如下: [java]   public class ClientActivity extends Activity {       private IPersonService personService;          @Override       public void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.main);           this.bindService(new Intent("cn.itcast.process.aidl.PersonService"), this.serviceConnection, BIND_AUTO_CREATE);//綁定到服務       }          @Override       protected void onDestroy() {           super.onDestroy();           this.unbindService(serviceConnection);//解除服務       }                 private ServiceConnection serviceConnection = new ServiceConnection() {           @Override           public void onServiceConnected(ComponentName name, IBinder service) {               personService = IPersonService.Stub.asInterface(service);               try {                   personService.save(new Person(56,"liming"));               } catch (RemoteException e) {                   Log.e("ClientActivity", e.toString());               }           }           @Override           public void onServiceDisconnected(ComponentName name) {               personService = null;           }       };   }      
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved