学些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系统源代码情景分析》罗升阳著