Android服务组件(Service)基本概念 | 青训营笔记

187 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第3天。

Android服务组件(Service)是一个后台运行的组件,通过服务组件可以使Android程序在未在前台运行时仍然可以完成一些任务(例如后台下载、后台音频播放、后台邮件检查等)。Service可以由其他应用启动,并能将组件绑定到Service上进行交互,通过Service,甚至可以实现进程间通信(IPC)。

Service基本形式

Service的基本形式分为启动和绑定两种状态。

  • 当应用组件通过调用startService()启动服务时,服务处于启动状态,这种状态的服务可以无限期运行(无论启动它的应用组件是否被销毁),直到任务完成由服务自行结束运行(例如:下载服务在下载完成后自行停止,在下载完成前不会停止)。通常来说,以这种状态运行的服务执行单一操作,且不会将相关信息返回给调用方。
  • 当应用组件通过调用bindService()绑定到服务时,服务处于绑定状态,这种状态的服务提供一个client-server(即客户-服务器)接口,组件可以通过发送请求给服务来实现与服务的交互,服务可以返回信息给绑定了服务的组件。多个组件可以绑定同一个服务,而在绑定到服务的全部组件都解绑后,服务将被销毁。

服务既可以以启动状态运行,也可以以绑定状态运行,也可以同时以两种状态运行(即服务既提供交互接口,又可以无限期运行)。一个服务可以以何种状态运行取决于是否实现了相应的回调方法:onStart()(允许组件启动服务)和 onBind()(允许组件绑定服务)。当内存过低且系统必须回收资源供具有用户焦点的Activity使用时,Android 系统可能会强制停止服务。

Service基本用法

  1. 注册
    • 在AndroidManifest中使用<service.../>标签,例如:
    <manifest ... >
    ...
        <application ... >
            <service android:name=".DemoService" />
            ...
        </application>
    </manifest>
    
    • 可以在此时声明服务为私有服务,阻止其他应用访问服务
  2. 创建
    • 建立相应的Service实现类
  3. 加载
    • 通过startService()/bindService()启动服务

Service生命周期

两种方式(启动状态/绑定状态)启动的Service生命周期如下所示:

service_lc.png

通过onStart()启动的服务,将通过stopSelf()stopService()停止服务。onBind()方法需要返回一个IBinder来提供交互接口,以供客户与服务器通信。

Service与Activity通信

详见详解Android Service与Activity之间通信的几种方式

  • 通过Binder

    1. 定义Binder子类,实现getService()方法,返回Service对象
    2. 实现Service类的onBind()方法,返回Binder对象
    3. Activity类中实例化ServiceConnection对象,并实现onServiceConnected()方法
    4. Activity调用bindService()方法得到Service实例,调用Service的方法实现通信
  • 通过Broadcast

    1. Service类中发送广播
    2. 在Activity类中实现广播接收器并注册广播