编程语言爱好者Android开发Android技术知识

浅析Binder(七)——Java服务代理对象的获取

2017-01-12  本文已影响83人  NoOneDev

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

上一篇 下一篇

猜你喜欢

热点阅读