Android之AIDL實現Demo

來源:互聯網
上載者:User

轉寄,但原來有問題,大體就是這樣,有問題的我都改了,現在這個是完成能夠啟動並執行,親測。

      
建立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類的參數值,需要補充一個android:progress=":remote"。

       建立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" android:process=":remote"> 
<intent-filter> 
<action android:name="net.blogjava.mobile.aidl.IMyService" /> 
</intent-filter> 
</service> 

        下面來編寫用戶端的調用代碼。首先建立一個Eclipse Android工程(ch08_aidlclient),並aidl檔案以及包發送到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); 
}

}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.