Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 開發入門 >> 什麼是AIDL服務

什麼是AIDL服務

編輯:開發入門

跨進程訪問(AIDL服務)android系統中的進程之間不能共享內存,因此,需要提供一些機制在不同進程之間進行數據通信。我們知道4個Android應用程序組件中的3個(Activity、Broadcast和Content Provider)都可以進行跨進程訪問,另外一個android應用程序組件Service同樣可以。這就是本節要介紹的AIDL服務。
什麼是AIDL服務
為了使其他的應用程序也可以訪問本應用程序提供的服務,android系統采用了遠程過程調用(Remote Procedure Call,RPC)方式來實現。與很多其他的基於RPC的解決方案一樣,Android使用一種接口定義語言(Interface Definition Language,IDL)來公開服務的接口。因此,可以將這種可以跨進程訪問的服務稱為AIDL(android Interface Definition Language)服務。

建立AIDL服務的步驟(1)
建立AIDL服務要比建立普通的服務復雜一些,具體步驟如下:
(1)在Eclipse android工程的Java包目錄中建立一個擴展名為aidl的文件。該文件的語法類似於Java代碼,但會稍有不同。詳細介紹見實例的內容。
(2)如果aidl文件的內容是正確的,ADT會自動生成一個Java接口文件(*.Java)。
(3)建立一個服務類(Service的子類)。
(4)實現由aidl文件生成的Java接口。
(5)在androidManifest.XML文件中配置AIDL服務,尤其要注意的是,<action>標簽中android:name的屬性值就是客戶端要引用該服務的ID,也就是Intent類的參數值。

實例:

服務器端:
本例中將建立一個簡單的AIDL服務。這個AIDL服務只有一個getValue方法,該方法返回一個String類型的值。在安裝完服務後,會在客戶端調用這個getValue方法,並將返回值在TextVIEw組件中輸出。建立這個AIDL服務的步驟如下:
(1)建立一個aidl文件。在Java包目錄中建立一個IMyService.aidl文件。IMyService.aidl文件的位置如圖所示。
server2.png 
IMyService.aidl文件的內容如下:
package cn.m9.mobile.aidl;
interface IMyService {
String getValue();
}

IMyService.aidl文件的內容與Java代碼非常相似,但要注意,不能加修飾符(例如,public、private)、AIDL服務不支持的數據類型(例如,InputStream、OutputStream)等內容。

(2)如果IMyService.aidl文件中的內容輸入正確,ADT會自動生成一個IMyService.Java文件。讀者一般並不需要關心這個文件的具體內容,也不需要維護這個文件。
(3)編寫一個MyService類。MyService是Service的子類,在MyService類中定義了一個內嵌類(MyServiceImpl),該類是IMyService.Stub的子類。MyService類的代碼如下:
package cn.m9.mobile.aidl;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
public String getValue()
{
return "android is very powerful";
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return new MyServiceImpl();
}
}

在編寫上面代碼時要注意如下兩點:
IMyService.Stub是根據IMyService.aidl文件自動生成的,一般並不需要管這個類的內容,只需要編寫一個繼承於IMyService.Stub類的子類(MyServiceImpl類)即可。
onBind方法必須返回MyServiceImpl類的對象實例,否則客戶端無法獲得服務對象。
(4)在androidManifest.XML文件中配置MyService類,代碼如下:
<service android:name=".MyService">
<intent-filter>
<action android:name="cn.m9.mobile.aidl.IMyService" />
</intent-filter>
</service>
其中"cn.m9.activity.IMyService"是客戶端用於訪問AIDL服務的ID。

下面來編寫客戶端的調用代碼。首先新建一個Eclipse android工程(TestAidlClIEnt),並將自動生成的IMyService.Java文件連同包目錄一起復制到testAIDL_clIEnt工程的src目錄中(R文件除外),如圖8.25所示。
client2.png 


調用AIDL服務首先要綁定服務,然後才能獲得服務對象,代碼如下:

package cn.m9.mobile;
import cn.m9.mobile.R;
import cn.m9.mobile.aidl.IMyService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.VIEw;
import android.view.VIEw.OnClickListener;
import android.widget.Button;
import android.widget.TextVIEw;
public class TestAidlClIEnt extends Activity implements OnClickListener {
/** Called when the activity is first created. */

private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textVIEw;
private static final String TAG="TestAIDLClIEnt";

private ServiceConnection serviceConnection = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub

myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentVIEw(R.layout.main);
btnInvokeAIDLService = (Button) findVIEwById(R.id.btnInvokeAIDLService);
btnBindAIDLService = (Button) findVIEwById(R.id.btnBindAIDLService);
btnInvokeAIDLService.setEnabled(false);
textView = (TextView) findViewById(R.id.textvIEw);
btnInvokeAIDLService.setOnClickListener(this);
btnBindAIDLService.setOnClickListener(this);
}
@Override
public void onClick(View vIEw) {
// TODO Auto-generated method stub
switch (vIEw.getId())
{
case R.id.btnBindAIDLService:
//綁定AIDL服務

bindService(new Intent("cn.m9.mobile.aidl.IMyService"), serviceConnection,Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try{
textVIEw.setText(myService.getValue());
} catch (Exception e)
{
}
break;
}
}
}

在編寫上面代碼時應注意如下兩點:
使用bindService方法來綁定AIDL服務。其中需要使用Intent對象指定AIDL服務的ID,也就是<action>標簽中android:name屬性的值。
在綁定時需要一個ServiceConnection對象。創建ServiceConnection對象的過程中如果綁定成功,系統會調用onServiceConnected方法,通過該方法的service參數值可獲得AIDL服務對象。
首先運行AIDL服務程序,然後運行客戶端程序,單擊【綁定AIDL服務】按鈕,如果綁定成功,【調用AIDL服務】按鈕會變為可選狀態,單擊這個按鈕,會輸出getValue方法的返回值,如下圖所示:
模擬器.png 

注:這是自己實踐的代碼,也參考了網上牛人的資料
和大家共享
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved