ServiceManager学习 (manager与Service之间关系)
来源:互联网 发布:剑三好友招募积分算法 编辑:程序博客网 时间:2024/04/30 19:25
在Android系统中,ServiceManager作为各个服务管理的大总管,起着非常重要的作用。如WindowManager,inputmethodManager,MediaPlayerService,AlarmManager,ActivityManager,WifiManager等等都是由ServiceManager来管理的,而服务与各自客户端通过Binder通信机制来沟通。
ServiceManager所管理的所有Service都是以相应的Manager返回给客户端,在Android系统中,Manager意思是经纪人,Manager所管理的对象是服务本身,
因为每个具体的服务一般会提供多个API接口,而Manager就是管理这些API接口。客户端一般不能直接通过Binder引用去访问具体的服务,而是要经过一个Manager
,相应的manager类对客户端是可见的,而远程服务端的类是对客户端则是隐藏的。例如:ServiceManager对客户端可见,而media.player服务对客户端是隐藏的。
而这些Manager类内部都会有一个远程服务Binder的变量,在一般情况下这些Manager的构造函数参数中都会包含这个Binder对象。简言之,先通过ServiceManager
获取远程服务的Binder引用,然后使用这个Binder引用构造一个客户端可以访问的经纪人,然后客户端就可以通过该经纪人访问远程的服务。
这种设计的作用是屏蔽直接访问远程服务,从而可以给应用程序提供灵活的,可控的API接口。
应用程序通过Manager类访问远程服务的模型
例如获取MediaService:
(1)调用defaultServiceManager获取到ServiceManager sm;
(2)通过sm 获取远程服务的binder引用 mBinder = sm->getService(String16("media.player"));
(3)将远程Binder引用转成远程服务
sp<ImediaPlayerService>mService = interface_cast<IMediaPlayerService>(mBinder)
通过asInterface()方法得到远程服务
(4)有了经纪人mService就可以使用远程服务
备注:
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
return INTERFACE::asInterface(obj);
}
interface_cast<IMediaPlayerService>(mBinder) ==>
sp<IMediaPlayerService> interface_cast(const sp<IBinder>& mBinder)
{
return IMediaPlayerService::asInterface(mBinder);
}
IMediaPlayerService::asInterface()的声明:
IInterface.h中
IMPLEMENT_META_INTERFACE宏定义
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
const android::String16 I##INTERFACE::descriptor(NAME); \
const android::String16& \
I##INTERFACE::getInterfaceDescriptor() const { \
return I##INTERFACE::descriptor; \
} \
android::sp<I##INTERFACE> I##INTERFACE::asInterface( \
const android::sp<android::IBinder>& obj) \
{ \
android::sp<I##INTERFACE> intr; \
if (obj != NULL) { \
intr = static_cast<I##INTERFACE*>( \
obj->queryLocalInterface( \
I##INTERFACE::descriptor).get()); \
if (intr == NULL) { \
intr = new Bp##INTERFACE(obj); \
} \
} \
return intr; \
} \
I##INTERFACE::I##INTERFACE() { } \
I##INTERFACE::~I##INTERFACE() { } \
IMediaPlayer.cpp文件中
IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer"); // 定义MediaPlayer服务的asInterface方法
WindowManager,ActivityManager,WifiManager,AlarmManager等更多服务需要更深入研究Android源码。
- ServiceManager学习 (manager与Service之间关系)
- Service与Android系统设计(4)-- ServiceManager
- Service与Android系统设计(4)-- ServiceManager
- service manager和binder service的关系
- ServiceManager 学习
- ServiceManager 学习
- Service与Activity之间通信(学习笔记)
- Hook学习(四):寻找突破点-ServiceManager
- Android Service介绍(Service与线程关系)
- 浅谈数学、数学建模与人工智能(机器学习,深度学习)之间的关系?
- 【学习】Service与Activity之间通信的几种方式
- Cloudera Manager ☞ Role&Role Instance &Role Group&Service关系
- OC学习日记08-对象与对象之间的关系( 继承、 复合 、依赖)
- Spring学习笔记(五)bean之间的关系与作用范围
- JAVA学习之:类与类之间的关系
- 机器学习、模式识别与数据挖掘之间的关系
- java学习笔记----类与类之间的关系
- 正在学习函数与泪之间的关系
- 迭代器和下标之间转换
- jdbc连接sqlserver2008过程注意几点(非web项目)
- 修改smali文件重新编译后出现 java.lang.VerifyError:
- CSDN的博客积分计算规则及博客排名规则 csdn博客计分原则 CSDN博客排名规则
- Ext TextField默认提示信息,并支持中文按2个长度计算
- ServiceManager学习 (manager与Service之间关系)
- 湘潭邀请赛——Welcome to XTCPC
- 新家入住气味难忍 除去甲醛有妙招
- dedecms织梦:feedback评论内容
- 免费无线网络成为商家营销新模式
- 设计模式之装饰模式
- 第七周作业——背包问题
- UI 指派初始化方法 视图控制器 button响应方法
- JD 1526 朋友圈(并查集 合并)