android核心服务初探

      终于进入android学习的进阶阶段,第一个课题是android的核心服务。首先,让我们来认识一下核心服务。

      android核心服务与app服务有所区别。app服务继承自Service基类,在app运行时启动并绑定到Activity上。核心服务是在设备开机时解析init.rc文件预装在系统中的,早于任何一个app进程和app服务。app服务是有ActivityManangerServiec启动并绑定,而核心服务必须在ServiceManager中注册。

      核心服务有分为native service和android service两种。一般来说,native service有c/c++编写,主要实现靠近驱动层的功能,android service由java编写,主要实现靠近app的功能。不管是何种核心服务,都运行在于app不同的进程中,因此,app想要与核心服务通信就必须使用IPC。

      IPC是android中解决进程间通信的精巧框架,代码不多,功能强大。进程A想要与服务所在的进程B通信,必须先获取到服务的IBinder接口。IBinder接口,主要实现进程间的关联,将会在进程A中诞生一个BinderProxy。这个代理类,运行在进程A,将代理所有对进程B中的服务请求。对于进程A来说,就像是自身拥有这个服务。使用这样的client-server结构完美的实现了高内聚低耦合。

      前面提到核心服务由ServiceManager启动和管理,其他进程要访问某服务都必须通过ServiceManager才能拿到IBinder接口。启动核心服务时,其中至关重要的一环是将核心服务登录到ManagerService中,代码如下:

      int r = defaultServiceManager()->addService(String16("xxx"),new SQRService);

      此时,意味着该核心服务可以被请求和绑定。请求IBinder接口代码如下:

      m_ib = sm->getService(String16("xxx"));

      从软硬整合的角度来说,核心服务的存在是为了让上层java应用程序使用Driver/HW Device特色的重要管道。基于android的开源特性,不同硬件厂家会有自主设计、性能各异的硬件设备,合理编写c层核心服务有利于充分发挥硬件特性。底层的优越设计将为上层应用的性能和用户体验提供强力支撑,可谓android框架中力与美的结合。

设计心得

      刚才提到的client-server结构是IPC框架中的重要思想,我们在编写JNI层小框架的时候,也可以应用这个思想。其中的关键之处便是将控制点下移到c层,将服务程序封装在自己的框架中,高内聚低耦合。c层负责获取核心服务的IBinder接口并建立java层的BinderProxy对象,将BinderProxy的接口返回到java层。 代码如下:

      sp<IServiceManager> sm = defaultServiceManager();

      m_ib = sm->getService(String16("xxx");

       jObject ibj = javaObjectForIBinder(env,mib);

转载于:https://www.cnblogs.com/bulengjianghu/p/androi_core_service.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值