編輯:初級開發
一、為什麼要使用AIDL,他的優勢有哪些呢?
AIDL服務更像是 一個Server,可以為多個應用提供服務。由於使用了IDL這樣類似COM組件或者說中間語言的設計,可以讓後續的開發者無需了解內部,根據暴漏的接口實現相關的操作,AIDL可以工作在獨立的進程中。
二、學習AIDL服務需要有哪些前置知識?
作為Android上服務的擴展,首先你要了解Android Service模型,Android Serivice我們可以分為兩種模式,三個類型,1.最簡單的Service就是無需處理onBind方法,一般使用廣播通訊,效率比較低。2. 使用Binder模式處理Service和其他組件比如Activity通訊,android開發網提示對於了解了Binder模式的服務後,開發AIDL遠程服務就輕松容易的多。
三、具體實例,我們以com.android123.cwj.demo為工程名,首先在工程目錄的com.android123.cwj目錄下創建一個ICWJ.aidl文件,內容為
package com.android123.cwj;
interface ICWJ {
String getName();
}
如果格式AIDL格式沒有問題,在Eclipse中ADT插件會在工程的gen目錄下會自動生成一個Java實現文件。
在Service中代碼如下:
public class CWJService extends Service {
public static final String BIND = "com.android123.cwj.CWJService.BIND";
public String mName="android123";
private final ICWJ.Stub mBinder = new ICWJ.Stub()
{
@Override
public String getName() throws RemoteException
{ //重寫在AIDL接口中定義的getName方法,返回一個值為我們的成員變量mName的內容。
try
{
return CWJService.this.mName;
}
catch(Exception e)
{
return null;
}
}
};
@Override
public void onCreate() {
Log.i("svc", "created.");
}
@Override
public IBinder onBind(Intent intent) {
return mBinder; //這裡我們要返回mBinder而不是一般Service中的null
}
}
接著在androidManifest.XML文件中定義
<service android:name=".CWJService">
<intent-filter>
<action android:name="com.android123.cwj.CWJService.BIND" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
接下來在Activity中的調用,我們可以
private ICWJ objCWJ = null;
private ServiceConnection serviceConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
objCWJ = ICWJ.Stub.asInterface(service);
}
};
在Activity的onCreate中加入綁定服務的代碼
Intent intent = new Intent();
intent.setClass(this, CWJService.class);
bindService (intent, serviceConn, Context.BIND_AUTO_CREATE);
同時重寫Activity的onDestory方法
@Override
public void onDestroy() {
unbindService(serviceConn); // 取消綁定
super.onDestroy();
}
執行AIDL的getName可以通過下面的方法
if (objCWJ == null)
{
try {
String strName = obj.getName();
}
catch (RemoteException e)
{}
}
以上過程中,如果ADT插件沒有自動生成ICWJStub類在工程的gen目錄下時,可以手動在sdk根目錄下platform-tools目錄下,手動實用AIDL.exe來生成,這樣可以看清楚AIDL文件到底是哪裡存在格式上的錯誤。有關AIDL中傳遞參數,實用復雜類型,還有導出成為獨立的進程,android123在明天給出另一個示例。
上課講義摘錄之13:android的IBinder介面及其安全性機制Activity物件與Service物件在不同的進程(Process)裡執行,各有不同的UID(Un
Google先後開始向自己的兩款旗艦手機Nexus One和Nexus S推送Android的小版本升級2.3.3。這也是官方版本Gingerbread發布近兩個月後,
AppWidgetManager作為android平台上最主要的Widgets管理類,提供了更新AppWidget狀態,獲取已經安裝的Appwidget提供信息和其他的
接上,其實BnMediaPlayerService->onTransact函數的結構也很簡單,就是switch...case...接收不同的請求執行不同的代碼調用