Android 服务概要

在Android Framework或应用开发主要API都是以系统服务的形式存在的。像读感应器的值、获取终端的位置,都是在Framework中以服务的形式存在的。

 

Android服务的种类

 

Android 应用程序服务

Android应用程序服务都是Android的一种应用程序组件。

开发者可以通过以下两种方法来使用这些服务:

1. 服务的启动和终止;

2. 通过服务绑定,实现远程控制。

当 Media Player 中播放音乐时,后台的音乐服务就会启动,音乐就会继续播放下去;

而需要对音乐进行播放、暂停、后退时,就需要连接到正在运行的音乐服务就可以,这一过程被称为服务的绑定,被绑定后的服务就可以自由调用服务的各个方法,如RPC。

Android RPC原理

原理:

1. RPC以接口形式实现;

2. 原理来自代理模式和RMI结构;

3. 被请求端的接口类以一个Service为代理,在客户端绑定Service过程中返回远程对象。

 

目的:

在不同的应用进程间,一个进程调用另一个进程中的对象。

 

应用步骤:

1. 定义一个后缀为 .aidl 的接口文件,ADT工具会自动生成对应的Java接口类并且该接口类中有个Stub内部抽象类。

2. 定义上述接口的实现类。

3. 用一个Service作为代理,在它的 onBind() 方法中返回一个接口实例对象。

4. 客户端对绑定这个代理角色Service,同时获得返回的接口实例对象,进而使用该对象。

 

逻辑图:

1. 上图中Service作为接口实例对象的代理,在绑定该服务时,返回接口实例对象,供客户端操作。

2. 用户定义的接口时先定义后缀为 .aidl 的接口,然后由工具自动生成的该接口文件(该文件用户不可修改)。

3. 接口实现类一般直接继承Stub这个内部抽象类。

4. 虽然客户端与Service分别处于不同的进程中,但客户端通过远程Service来获取其他进程中的实例。

 

应用程序服务-本地服务

Activity与它所创建的本地服务都在同一进程中,当应用程序终止时,本地服务也随之停止。

1. 调用bindService(),尝试绑定LocalService。

2. 在待绑定的服务生成之后,Android会调用服务的onBind()回调方法,用来处理服务绑定;

调用onBind()方法将返回LocalBinder对象,继承自Binder类,Activity使用该对象与LocalService对象。

3. 前两步进行顺利的话,处理服务绑定的对象创建成功,Android Framework就会调用服务客户端的onServiceConnected(ComponentName,IBinder)方法,该方法的第二个参数保存着步骤(2)中onBinder()生成的LocalBinder对象的引用。

LocalBinder继承自Binder类,而Binder类又实现了IBinder接口,所以第二个参数IBinder Service可以接收LocalBinder对象。

4. 保存LocalService对象的引用到Activity的getService成员中,本地服务绑定完成。

 

应用程序服务-远程服务

就远程服务而言,Activity与远程服务运行在不同的进程中,Activity若想控制远程服务,就必须使用IPC机制。

1. BindingActivity:请求RemoteService连接。

Activity必须先调用binService(),绑定到远程服务上,才能实现对服务的远程控制。

bindService()的第一个参数是Intent,用来运行远程服务,而在RemoteService的manifest中,可看到服务处理的动作。

2. Remote服务:具体实现服务方法,并提供用于通信的Binder对象。

服务启动后,依次调用onCreate()和onBind()方法,onBind()方法的主要作用是生成用于处理Binder IPC的Binder对象,并将其返回给系统。

3. BindingActivity:生成执行服务与Binder IPC的代理对象。

当(1)中的请求服务生成之后,将调用回调方法onBind(),返回Binder对象,Android Framework调用回调方法onServiceConnected(),它的第二个IBinder类型的参数接收Binder对象,而后将其传递给ISecondary.Stub.as.Interface()函数,并使用它生成与RemoteService服务绑定在一起的服务代理对象ISecondary.Stub.Proxy,最后将其保存到mSecondaryService成员变量中。

至此,RemoteService的ISecondary接口的绑定就完成了。Activity可以通过保存在mSecondaryService成员变量中的服务代理对象,调用RemoteService的方法就像使用自己的方法一样。

4. BindingActivity:使用服务代理对象,调用RemoteService服务的代理方法。

5. Binder IPC:服务代理对象(ISecondary.Stub.Proxy)向服务Binder对象(ISecondary.Stub)传递Binder IPC数据。

6. RemoteService服务:调用RemoteService服务的Stub方法。ISecondary.Stub服务Binder对象获取Binder IPC数据后,会调用(2)实现的getPid()Stub方法。

 

Android 系统服务

Android系统服务提供系统最基本、最核心的功能,如设备控制、位置信息、通知信息等,这些服务分别存在Android Framework 与 Library层之中。

Android Framework:核心平台服务和硬件服务。

Library:本地系统服务。

 

系统服务 - 本地系统服务

本地系统服务使用C++编写,运行在Library层,主要包含Audio Flinger、Surface Flinger等。

Audio Flinger

AudioFlinger服务混合多种Android应用程序的音频数据,并发送到耳机,扬声器等音频输出设备中。在Android设备中,所有音频数据均由Audio Flinger进行输出。

 

Surface Flinger

Surface Flinger是Android Multimedia的一部分,它是一个服务,提供系统服务范围内的Surface composer功能,将各种应用程序的Surface组合后渲染到Frame Buffer设备中。

 

系统服务 - Java系统服务

在Android启动时,Java系统服务由SystemServer系统进程启动,分为核心平台服务和硬件服务。

1. 核心平台服务(Core Platform Service)

ActivityManagerService:管理所有Activity的生命周期与堆栈。

WindowMangerService:位于Surface Flinger之上,将要绘制到机器画面上的内容传递给Surface Flinger。

PackageManagerService:加载apk(Android包文件)信息,提供信息显示系统中设置了哪些包,以及加载了哪种包。

 

2. 硬件服务(Hardware Service)

AlarmManagerService:在特定时间后运行指定应用程序,就像定时器。

ConnectivityService:提供有关网络当前状态的信息。

LocationService:提供终端当前的位置信息。

PowerService:设备电源管理。

SensorService:提供Android中各种传感器的感应值。

TelephonyService:提供话机状态及电话服务。

WifiService:控制无线网络连接,如AP搜索,连接列表管理。

 

如何使用Java系统服务呢?

APP若想使用LocationService,需先调用getSystemService()函数创建与LocationService相应的LocalManager对象,而后应用程序使用生成的LocalManager对象,调用LocationService提供的各种函数,执行相应的功能。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值