1 - 實現service端應用。
2 - 實現client端應用。
實現service端應用
1. 建立一個空的Android工程aidlservice。在src目錄下建立一個擴展名爲aidl的文件(IMyService.aidl)。
- package com.yubing;
- interface IMyService
- {
- String getValue(); // 爲AIDL服務的接口方法,調用AIDL服務的程序需要調用該方法
- }
2. 在保存IMyService.aidl文件後,ODT會在gen目錄下產生一個IMyService.java文件。
讀者可以不必管這個文件中的內容,也不需要修改該文件的內容。這個文件是由Eclipse插件ODT自動維護的,只要修改了IMyService.aidl文件的內容,IMyService.java文件的內容就會隨之改變。
3. 建立一個服務類(Service的子類),實現由aidl文件生成的Java接口。
- package com.yubing;
- ... ...
- public class MyService extends Service
- {
- // IMyService.Stub類是根據IMyService.aidl文件生成的類,該類中包含了接口方法(getValue)
- public class MyServiceImpl extends IMyService.Stub
- {
- @Override
- public String getValue() throws RemoteException
- {
- return "從AIDL服務獲得的值:OK.";
- }
- }
- @Override
- public IBinder onBind(Intent intent)
- {
- // 該方法必須返回MyServiceImpl類的對象實例
- return new MyServiceImpl();
- }
- }
4. 在AndroidManifest.xml文件中配置AIDL服務,尤其要注意的是,<action>標籤的android:name屬性值就是客戶端要引用該服務的ID,也就是Intent類構造方法的參數值。
- <!-- 註冊服務 -->
- <service android:name=".MyService">
- <intent-filter>
- <!-- 指定調用AIDL服務的ID -->
- <action android:name="com.yu.IMyService" />
- </intent-filter>
- </service>
實現client端應用
下面來看看如何調用這個AIDL服務。首先建立一個Android工程:aidlclient。然後將aidlservice工程中自動生成的IMyService.java文件複製到aidlclient工程中。在調用AIDL服務之前需要先使用bindService方法綁定AIDL服務。bindService方法需要一個ServiceConnection對象。ServiceConnection有一個onServiceConnected方法,當成功綁定AIDL服務且,該方法被調用。並通過service參數返回AIDL服務對象。下面是調用AIDL服務的完成代碼。
- package com.yu;
- ... ...
- public class Main extends Activity implements OnClickListener
- {
- private IMyService myService = null;
- // 創建ServiceConnection對象
- private ServiceConnection serviceConnection = new ServiceConnection()
- {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service)
- {
- // 獲得AIDL服務對象
- myService = IMyService.Stub.asInterface(service);
- try
- {
- // 調用AIDL服務對象中的getValue方法,並以對話框中顯示該方法的返回值
- new AlertDialog.Builder(Main.this).setMessage(
- myService.getValue()).setPositiveButton("確定", null)
- .show();
- }
- catch (Exception e)
- {
- }
- }
- @Override
- public void onServiceDisconnected(ComponentName name)
- {
- }
- };
- @Override
- public void onClick(View view)
- {
- // 綁定AIDL服務
- bindService(new Intent("com.yu.IMyService"),
- serviceConnection, Context.BIND_AUTO_CREATE);
- }
- ... ...
- }
在編寫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方法的返回值。