Server进程和Client进程获取ServiceManager的远程接口

本文深入探讨了Android系统中Server进程和Client进程如何获取ServiceManager的远程接口,详细阐述了ServiceManager作为Server进程的特殊性,以及Client如何无需通过常规Binder通信机制直接获取其接口。同时,解释了ServiceManager远程接口的对象类型BpServiceManager及其关键接口和服务注册过程,并介绍了通过defaultServiceManager函数获取ServiceManager代理对象的实现细节。
摘要由CSDN通过智能技术生成

上篇博客ServiceManager如何成为Binder进程通信的守护进程已经详细讲述了ServiceManager是如何成为守护进程,然而其作为守护进程是如何为Server进程和Client进程提供服务的,也即Server进程和Client进程如何获得ServiceManager的远程接口(代理对象)的呢?此时ServiceManager必然是作为Server的,其与普通的Server进程是不一样的;对于普通的Server来说,Client如果想要获得Server的远程接口,必须通过ServiceManager远程接口提供的getService接口来获得,这本身就是一个Binder机制进行进程间通信的过程;然而对于ServiceManager这个Server来说,Client如果想得到ServiceManager远程接口,不必通过进程间通信机制来获得,因为ServiceManager远程接口是一个binder引用,它的句柄一定是0;

一、ServiceManager远程接口关系图


1)ServiceManager远程接口对象类型为BpServiceManager,它用来描述一个实现IServiceManager接口的Client组件。

2)IServiceManager接口定义4个成员函数getService,checkService,addService和listService;其中,getService和checkService是用来获取Service组件的代理对象的。addService用来注册Service组件的;listService用来获取注册在ServiceManager中的Service组件的列表。

3)对一般的Service组件来说,Client进程首先要通过Binder驱动程序来获取它的一个句柄值,然后通过这个句柄创建一个Binder代理对象,最后将这个Binder代理对象封装成一个实现特定接口的代理对象由于ServiceManager的句柄值为0,因此获取它的代理对象不需要跟Binder驱动程序进程交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值