Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android AIDL進程間通信接口使用示例

Android AIDL進程間通信接口使用示例

編輯:Android開發實例

AIDL:Android Interface Definition Language,它是一種android內部進程通信接口的描述語言,通過它我們可以定義進程間的通信接口。

ICP:Interprocess Communication ,內部進程通信。

使用:

1、先創建一個aidl文件,aidl文件的定義和java代碼類似,但是!它可以引用其它aidl文件中定義的接口和類,但是不能引用自定義的java類文件中定義的接口和類,要引用自定義的接口或類,需要為此類也定義一個對應的aidl文件,並且此類要實現Parcelable接口,同時aidl文件和類文件必須要在相同包下進行聲明;Android包含了aidl編譯器,當定義好一個aidl文件的時候,會自動編譯生成一個java文件,此文件保存在gen目錄之下。

 

在這個項目中,定義了兩個aidl文件,其中Person實現了接口Parcelable,下面是這兩個aidl文件的定義:

  1. Person.aidl  
  2.    
  3. {  
  4.    
  5. parcelable Person;   
  6.    
  7. }  
  8.    
  9. IAIDLServerService.aidl  
  10.    
  11. {  
  12.    
  13.   package com.webview;  
  14.   import com.webview.Person;// 引用上面的Person.aidl  
  15.    
  16.   interface IAIDLServerService{  
  17.      String sayHello();  
  18.      Person getPerson();  
  19.   }  
  20.    
  21. }  

2、編寫一個Service實現定義aidl接口中的內部抽象類Stub,Stub繼承自Binder,並繼承我們在aidl文件中定義的接口,我們需要實現這些方法。Stub中文意思存根,Stub對象是在服務端進程中被調用,即服務端進程。

在客戶端調用服務端定義的aidl接口對象,實現Service.onBind(Intent)方法,該方法會返回一個IBinder對象到客戶端,綁定服務時需要一個ServiceConnection對象,此對象其實就是用來在客戶端綁定Service時接收Service返回的IBinder對象。

  1. public static abstract class Stub extends android.os.Binder implements com.webview.IAIDLServerService  
  2.  public class AIDLServerService extends Service{  
  3.  
  4.     @Override  
  5.     public IBinder onBind(Intent intent) {  
  6.         return binder;  
  7.     }  
  8.       
  9.     private IAIDLServerService.Stub binder = new Stub() {  
  10.         @Override  
  11.         public String sayHello() throws RemoteException {  
  12.             return "Hello AIDL";  
  13.         }  
  14.           
  15.         @Override  
  16.         public Person getPerson() throws RemoteException {  
  17.             Person person = new Person();  
  18.             person.setName("Livingstone");  
  19.             person.setAge(22);  
  20.             return person;  
  21.         }  
  22.     };  
  23. }  

3、在服務端注冊Service,將如下代碼添加進Application節點之下!

  1. <service android:name="com.webview.AIDLServerService"   
  2.   android:process=":remote">   
  3.   <intent-filter>   
  4.     <action android:name="com.webview.IAIDLServerService"></action>   
  5.   </intent-filter>   
  6. </service>  

至此,服務端進程定義已經完成!

4、編寫客戶端,注意需要在客戶端存一個服務端實現了的aidl接口描述文件,客戶端只是使用該aidl接口,獲取服務端的aidl對象

 

(IAIDLServerService.Stub.asInterface(service))之後就可以調用接口的相關方法,而對象的方法的調用不是在客戶端執行,而是在服務端執行。

  1. public class MainActivity extends Activity {  
  2.  
  3.     private Button btn;  
  4.     private IAIDLServerService aidlService = null;  
  5.     private ServiceConnection conn = new ServiceConnection() {  
  6.  
  7.         @Override 
  8.         public void onServiceDisconnected(ComponentName name) {  
  9.             aidlService = null;  
  10.         }  
  11.  
  12.         @Override 
  13.         public void onServiceConnected(ComponentName name, IBinder service) {  
  14.             aidlService = IAIDLServerService.Stub.asInterface(service);  
  15.             try {  
  16.                 aidlService.doFunction();// 執行接口定義的相關方法  
  17.             } catch (RemoteException e) {  
  18.                 e.printStackTrace();  
  19.             }  
  20.         }  
  21.     };  
  22.  
  23.     @Override 
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.  
  28.         btn = (Button) findViewById(R.id.button);  
  29.         tv = (TextView) findViewById(R.id.textview);  
  30.         btn.setOnClickListener(new OnClickListener() {  
  31.             @Override 
  32.             public void onClick(View v) {  
  33.                 Intent service = new Intent("com.webview.IAIDLServerService");  
  34.                 bindService(service, conn, BIND_AUTO_CREATE);// 綁定服務  
  35.             }  
  36.         });  
  37.     }  
  38. }  

客戶端目錄結構:

 

轉自:http://www.cnblogs.com/a284628487/archive/2013/04/16/3024983.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved