當前位置:編程學習大全網 - 源碼下載 - android怎麽寫aidl文件

android怎麽寫aidl文件

建立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);

}。

  • 上一篇:SOA到底是什麽?作用是什麽_soa是什麽意思
  • 下一篇:想要找個好用的AIoT開發平臺,親們有知道的嗎?
  • copyright 2024編程學習大全網