歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 中的AIDL

今天要給大家分享的是Android aidl的使用。在Android中, 每個應用程序都可以有自己的進程. 在寫UI應用的時候, 經常要用到Service. 在不同的進程中, 怎樣傳遞對象呢? 顯然, Java中不允許跨進程內存共享. 因此傳遞對象, 只能把對象拆分成操作系統能理解的簡單形式, 以達到跨界對象訪問的目的. 在J2EE中,采用RMI的方式, 可以通過序列化傳遞對象. 在Android中, 則采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩.

AIDL(AndRoid接口描述語言)是一種借口描述語言; 編譯器可以通過aidl文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉化成AIDL可識別的參數(可能是多個參數), 然後使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成自己需要的對象.

AIDL的IPC的機制和COM或CORBA類似, 是基於接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關類.; 2. 調用aidl產生的class.

今天的兩個實例用到兩個Android工程,一個是AIDL的服務端另一個是客戶端。 

服務端的實現步驟:

首先看一下服務端,工程目錄如下:

首先創建IaidlServerService.aidl文件,代碼如下(一個簡單方法,另一個返回對象方法),當我們點擊保存時會在gen目錄下生成對應的java文件,如上圖紅色部分:

 

[java]

  1. package com.chapter8.aidl;  
  2. import com.chapter8.aidl.Book;  
  3. interface IAIDLServerService {   
  4.       
  5.     String sayHello();  
  6.       
  7.     Book getBook();  
  8. }  
  

第二步:因為這個接口裡有傳遞對象,所以對象要特殊處理一下,這裡繼承了Parcelable,Book.java代碼如下:

如果大家不明的地方,請參見,下面連接的文章:

Android中Intent傳遞對象的兩種方法(Serializable,Parcelable)!  http://www.linuxidc.com/Linux/2012-02/53067.htm

[java]

  1. package com.chapter8.aidl;  
  2. import android.os.Parcel;  
  3. import android.os.Parcelable;  
  4. public class Book implements Parcelable {  
  5.       
  6.     private String bookName;  
  7.     private int bookPrice;  
  8.       
  9.     public Book(){  
  10.           
  11.     }  
  12.       
  13.     public Book(Parcel parcel){  
  14.         bookName = parcel.readString();  
  15.         bookPrice = parcel.readInt();  
  16.     }  
  17.       
  18.     public String getBookName() {  
  19.         return bookName;  
  20.     }  
  21.     public void setBookName(String bookName) {  
  22.         this.bookName = bookName;  
  23.     }  
  24.     public int getBookPrice() {  
  25.         return bookPrice;  
  26.     }  
  27.     public void setBookPrice(int bookPrice) {  
  28.         this.bookPrice = bookPrice;  
  29.     }  
  30.       
  31.     public int describeContents() {  
  32.         return 0;  
  33.     }  
  34.     public void writeToParcel(Parcel parcel, int flags) {  
  35.         parcel.writeString(bookName);  
  36.         parcel.writeInt(bookPrice);  
  37.     }  
  38.       
  39.     public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {  
  40.         public Book createFromParcel(Parcel source) {  
  41.               
  42.             return new Book(source);  
  43.         }  
  44.         public Book[] newArray(int size) {  
  45.             return new Book[size];  
  46.         }  
  47.     };  
  48. }  
Copyright © Linux教程網 All Rights Reserved