學些AIDL可以知道在Client中需要調用后去遠程服務代理對象,才能訪問到遠程服務。
public class MainActivity extends Activity implement OnClickListener{
......
private IRemoteService remoteService = null;
@Override
public void onCreate(Bundle savedInstanceState){
......
remoteService = IRemoteService.Stub.asInstance(ServiceManager.getService(“remote”);
......
}
}
通過ServiceManager類的靜態成員函數getService來獲得一個名稱為“remote”的java代理對象。由于在前面一篇文章Java服務啟動中介紹了如何注冊一個名為“remote”的服務。然后我們就需要重點分析getService()
方法
//framworks/base/core/android/os/ServiceManager.java
public static IBinder getService(String name) {
try {
IBinder service = sCache.get(name);
if (service != null) {
return service;
} else {
return getIServiceManager().getService(name);
}
} catch (RemoteException e) {
Log.e(TAG, "error in getService", e);
}
return null;
}
sCache使用來保存前面已經獲取的Java服務代理對象,這些Java服務代理對象是通過他們引用的Java服務的名稱作為關鍵字來保存的。然后我們看getService()方法的具體實現。
//framworks/base/core/android/os/ServiceManagerNative.java
public IBinder getService(String name) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IServiceManager.descriptor);
data.writeString(name);
mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0);
IBinder binder = reply.readStrongBinder();
reply.recycle();
data.recycle();
return binder;
}
readStrongBinder是一個Jni方法,通過這個方法可以獲取到Java服務代理對象,詳情查看那源碼吧!
mRemote指向一個遠程Java本地服務對象,調用JNI方法transact()方法與遠程服務對象通信。
</br>
參考:
《Android系統源代碼情景分析》羅升陽著