關於AIDL的使用---- Android 進程間通訊之一
AIDL AndroidInterface Definition Language,即Android接口定義語言
由於進程間不能共享內存,因此,需要提供一些機制在不同進程之間進行數據通信。
其中AIDL是方法之一,一般都是配合service來進行跨進程通訊,單獨AIDL無法通信。
關於AIDL的使用,一般分爲server和client端。
Server的實現步驟如下:
1, 在server端生成一個以”.aidl”結尾的文件,定義接口,如下:
接口內容如下:
package com.example.server;
interface IRemoteService {
int getPid();
}
2, 編譯完成後會在gen目錄下生成一個同樣目錄的文件,文件名爲IRemoteService.java, 如下:
3, 定義一個service TAService, 實現 IRemoteService裏的接口
package com.example.server;
import com.example.server.IRemoteService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Process;
import android.util.Log;
public class TAService extends Service {
private static String TAG = "AIDLServer";
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG," onCreate........" + "Thread: " + Thread.currentThread().getName());
}
@Override
public IBinder onBind(Intent arg0) {
Log.i(TAG,"DDService onBind");
return mBinder;
}
private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
public int getPid(){
Log.i(TAG,"Thread: " + Thread.currentThread().getName());
Log.i(TAG," getPid ");
return Process.myPid();
}
};
}
4, 然後需要在server app 的AndroidManifest.xml 裏面聲明對應的service
<service
android:name="com.example.server.TAService"
android:enabled="true"
android:exported="true" >
</service>
Client 端實現步驟如下:
5, 定義一個和server端同一目錄的aidl文件
文件內容必須和server端的 文件內容一模一樣,包括參數名稱
package com.example.server;
interface IRemoteService {
int getPid();
}
6, 在對應調用TAService的activity中定義ServiceConnection,實現對應接口,代碼如下:
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
remoteService = IRemoteService.Stub.asInterface(service);
try {
int pid = remoteService.getPid();
int currentPid = Process.myPid();
Log.i(TAG,"currentPID: " + currentPid +" remotePID: " + pid);
} catch (RemoteException e) {
e.printStackTrace();
Log.i(TAG,"RemoteException");
}
Log.i(TAG,"bind success! " + remoteService.toString());
}
};
7, 綁定Server端的TAService,代碼如下:
Intent intent = new Intent();
ComponentName comp = new ComponentName("com.example.server",
"com.example.server.TAService");
intent.setComponent(comp);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
完成上述步驟以後即可在conn 的回調中執行aidl接口
執行client代碼之前首先要執行server端apk,保證TAService已經跑起來,否則client端綁定失敗, conn的兩個回調函數都跑不起來。
由此可見, AIDL支持跨進程間接口調用,不支持靜態數據讀取。
demo 代碼下載地址如下:
http://download.csdn.net/detail/kuanxu/9572698