AIDL實例

 這篇文章給出一個小例子,實現一個應用程序調用另一個應用程序中的service。兩個應用程序的進程通過AIDL(Android Interface Definition Language)通信。這個小例子主要分爲兩部分:

          1 - 實現service端應用。

          2 - 實現client端應用。

實現service端應用

1. 建立一個空的Android工程aidlservice。在src目錄下建立一個擴展名爲aidl的文件(IMyService.aidl)。

  1. package com.yubing;   
  2. interface IMyService   
  3. {   
  4.      String getValue();  //   爲AIDL服務的接口方法,調用AIDL服務的程序需要調用該方法   
  5. }  

2. 在保存IMyService.aidl文件後,ODT會在gen目錄下產生一個IMyService.java文件。

       讀者可以不必管這個文件中的內容,也不需要修改該文件的內容。這個文件是由Eclipse插件ODT自動維護的,只要修改了IMyService.aidl文件的內容,IMyService.java文件的內容就會隨之改變。

3. 建立一個服務類(Service的子類),實現由aidl文件生成的Java接口。

  1. package com.yubing;   
  2. ... ...   
  3. public class MyService extends Service   
  4. {   
  5.     //   IMyService.Stub類是根據IMyService.aidl文件生成的類,該類中包含了接口方法(getValue)   
  6.     public class MyServiceImpl extends IMyService.Stub   
  7.      {   
  8.         @Override  
  9.         public String getValue() throws RemoteException   
  10.          {   
  11.             return "從AIDL服務獲得的值:OK.";   
  12.          }   
  13.      }   
  14.     @Override  
  15.     public IBinder onBind(Intent intent)   
  16. {           
  17. //   該方法必須返回MyServiceImpl類的對象實例   
  18.         return new MyServiceImpl();   
  19.      }   
  20. }  

4. 在AndroidManifest.xml文件中配置AIDL服務,尤其要注意的是,<action>標籤的android:name屬性值就是客戶端要引用該服務的ID,也就是Intent類構造方法的參數值。

  1. <!--   註冊服務 -->   
  2. <service android:name=".MyService">   
  3.      <intent-filter>   
  4.          <!--   指定調用AIDL服務的ID   -->   
  5.          <action android:name="com.yu.IMyService" />   
  6.      </intent-filter>   
  7. </service>  

實現client端應用

       下面來看看如何調用這個AIDL服務。首先建立一個Android工程:aidlclient。然後將aidlservice工程中自動生成的IMyService.java文件複製到aidlclient工程中。在調用AIDL服務之前需要先使用bindService方法綁定AIDL服務。bindService方法需要一個ServiceConnection對象。ServiceConnection有一個onServiceConnected方法,當成功綁定AIDL服務且,該方法被調用。並通過service參數返回AIDL服務對象。下面是調用AIDL服務的完成代碼。

  1. package com.yu;   
  2. ... ...   
  3. public class Main extends Activity implements OnClickListener   
  4. {   
  5. private IMyService myService = null;   
  6. //   創建ServiceConnection對象   
  7.     private ServiceConnection serviceConnection = new ServiceConnection()   
  8.      {   
  9.         @Override  
  10.         public void onServiceConnected(ComponentName name, IBinder service)   
  11.          {   
  12.             // 獲得AIDL服務對象   
  13.              myService = IMyService.Stub.asInterface(service);   
  14.             try  
  15.              {   
  16.                 //   調用AIDL服務對象中的getValue方法,並以對話框中顯示該方法的返回值   
  17.                 new AlertDialog.Builder(Main.this).setMessage(   
  18.                          myService.getValue()).setPositiveButton("確定", null)   
  19.                          .show();   
  20.              }   
  21.             catch (Exception e)   
  22.              {   
  23.              }   
  24.          }   
  25.         @Override  
  26.         public void onServiceDisconnected(ComponentName name)   
  27.          {   
  28.          }   
  29.      };   
  30.     @Override  
  31.     public void onClick(View view)   
  32. {   
  33.     //   綁定AIDL服務   
  34.          bindService(new Intent("com.yu.IMyService"),   
  35.                  serviceConnection, Context.BIND_AUTO_CREATE);   
  36.      }   
  37.      ... ...   
  38. }  


       在編寫AIDL服務和客戶端時要注意如下兩點:

1. AIDL服務中的onBind方法必須返回AIDL接口對象(MyServiceImpl對象)。該對象也是onServiceConnected事件方法的第2個參數值。
2. bindService方法的第1個參數是Intent對象,該對象構造方法的參數需要指定AIDL服務的ID,也就是在AndroidManifest.xml文件中<service>標籤的<action>子標籤的android:name屬性的值。

現在先運行aidlservice程序,以便安裝AIDL服務,然後運行aidlclient程序,並單擊按鈕,會顯示如圖所示的對話框。對話框中的信息就是AIDL服務接口中getValue方法的返回值。



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