Android service 实现过程

本文详细介绍了Android Native Service的实现过程,包括其与Java Service的区别、为什么需要写底层服务、实现核心服务的关键点,以及具体的步骤。通过一个简单的AddService示例,展示了如何编写和启动一个Native Service,并给出了编译过程中的常见问题及解决方法。
摘要由CSDN通过智能技术生成

一、 Android Service 介绍

Android Service 分为两种: Android Service Native Service

Android Service :又称为 Java Service ,是实现在框架层( framework )里的 Server Android Service Java 编写。

Native Service :又称为 System Service ,是实现在 Runtime 层里的 Server

MediaPlayer 为例,从下图我们可以得出两种服务的关系:

 

 

接下来要讨论的 Service Native Service ,与应用程序设计上所讨论的 Service android.app.Service )不同。

 

二、为什么要写底层的核心服务呢?

1 因为底层核心服务是 Android 框架里最接近 Linux/Driver 的部分。为了充分发挥硬件设备的差异化特性,核心服务是让上层 Java 应用程序来使用 Driver/HW Device 特色的重要管道。

2 在开机过程中,就可以启动核心服务 ( 例如汉字输入法服务等 ) ,让众多应用程序来共享之。

3 由于共享,所以能有效降低 Java 应用程序的大小 (Size)

 

三、如何实现一个核心服务呢 ?

要点如下:

1 )核心服务通常在独立的进程 (Process) 里执行。

2 )必须提供 IBinder 接口,让应用程序可以进行跨进程的绑定 (Binding) 和呼叫。

3 )因为共享,所以必须确保多线裎安全 (Thread-safe)

4 )以 C++ 类别定义,诞生其对象,透过 SM 之协助,将该对象参考值传给 IServiceManager::addService() 函数,就加入到 Binder Driver 里了。

5 )应用程序可透过 SM 之协助而远距绑定该核心服务,此时 SM 会回传 IBinder 接口给应用程序。

6 )应用程序可透过 IBinder::transact() 函数来与核心服务互传数据。


四、 Server 实现实践

下面以一个小例子来说明具体实现一个 Server 的步骤。此实例功能为简单的整数加法 (Add) 运算,我们将其命名 AddService

Step-1 :以 C++ 撰写 AddService 类别,其完整程序代码为:

AddService.h 文件:

#ifndef ANDROID_GUILH_ADD_SERVICE_H

#define ANDROID_GUILH_ADD_SERVICE_H

#include <utils.h>

#include <utils/RefBase.h>

#include <utils/IInterface.h>

#include <utils/Parcel.h>

namespace android

{

       class AddService : public BBinder

       {

              mutable Mutex mLock;

              int32_t mNextConnId;

 

              public:

              static int instantiate();

              AddService();

              virtual ~AddService();

              virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);

       };

}

#endif

AddService.cpp 文件:

 

#include "AddService.h"

#include <utils/IServiceManager.h>

#include <utils/IPCThreadState.h>

 

namespace android {

       static struct sigaction oldact;

       static pthread_key_t sigbuskey;

       int AddService::instantiate() {

              LOGE("AddService instantiate");

 

              int r = defaultServiceManager()->addService(

                            String16("guilh.add"), new AddService());

              LOGE("AddService r = %d/n", r);

              return r;

       }

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值