標籤:android blog class java ext int
建立AIDL服務要比建立普通的服務複雜一些,具體步驟如下:
(1)在Eclipse Android工程的Java包目錄中建立一個副檔名為aidl的檔案。該檔案的文法類似於Java代碼,但會稍有不同。詳細介紹見執行個體52的內容。
(2)如果aidl檔案的內容是正確的,ADT會自動產生一個Java介面檔案(*.java)。
(3)建立一個服務類(Service的子類)。
(4)實現由aidl檔案產生的Java介面。
(5)在AndroidManifest.xml檔案中配置AIDL服務,尤其要注意的是,<action>標籤中android:name的屬性值就是用戶端要引用該服務的ID,也就是Intent類的參數值。
建立AIDL服務
本例中將建立一個簡單的AIDL服務。這個AIDL服務只有一個getValue方法,該方法返回一個String類型的值。在安裝完服務後,會在用戶端調用這個getValue方法,並將傳回值在TextView組件中輸出。建立這個AIDL服務的步驟如下:
(1)建立一個aidl檔案。在Java包目錄中建立一個IMyService.aidl檔案。IMyService.aidl檔案的位置
IMyService.aidl檔案的內容如下:
Java代碼:
package eoe.demo;
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類的代碼如下:
Java代碼:
package eoe.demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
@Override
public String getValue() throws RemoteException {
return "Android/OPhone開發講義";
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImpl();
}
}
在編寫上面代碼時要注意如下兩點:
IMyService.Stub是根據IMyService.aidl檔案自動產生的,一般並不需要管這個類的內容,只需要編寫一個繼承於IMyService.Stub類的子類(MyServiceImpl類)即可。
onBind方法必須返回MyServiceImpl類的對象執行個體,否則用戶端無法獲得服務物件。
(4)在AndroidManifest.xml檔案中配置MyService類,代碼如下:
Java代碼:
<service android:name=".MyService" >
<intent-filter>
<action android:name="net.blogjava.mobile.aidl.IMyService" />
</intent-filter>
</service>
下面來編寫用戶端的調用代碼。首先建立一個Eclipse Android工程(ch08_aidlclient),並將自動產生的IMyService.java檔案連同包目錄一起複製到ch08_aidlclient工程的src目錄中,。
調用AIDL服務首先要綁定服務,然後才能獲得服務物件,代碼如下:
Java代碼:
package net.blogjava.mobile;
import net.blogjava.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.view.View; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.TextView;
public class Main extends Activity implements OnClickListener {
private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textView;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 獲得服務物件
myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnBindAIDLService:
// 綁定AIDL服務
bindService(new Intent("net.blogjava.mobile.aidl.IMyService"), serviceConnection, Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try {
textView.setText(myService.getValue());
// 調用服務端的getValue方法
} catch (Exception e) {
}
break;
}
}
@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);
}
}
先運行ch08_aidl,然後運行ch08_aidlclient,先點擊bind按鈕,後點擊invoke按鈕,介面上即顯示“Android.OPhone開發講義”