这是我参与「第四届青训营 」笔记创作活动的第3天。
Android服务组件(Service)是一个后台运行的组件,通过服务组件可以使Android程序在未在前台运行时仍然可以完成一些任务(例如后台下载、后台音频播放、后台邮件检查等)。Service可以由其他应用启动,并能将组件绑定到Service上进行交互,通过Service,甚至可以实现进程间通信(IPC)。
Service基本形式
Service的基本形式分为启动和绑定两种状态。
- 当应用组件通过调用
startService()启动服务时,服务处于启动状态,这种状态的服务可以无限期运行(无论启动它的应用组件是否被销毁),直到任务完成由服务自行结束运行(例如:下载服务在下载完成后自行停止,在下载完成前不会停止)。通常来说,以这种状态运行的服务执行单一操作,且不会将相关信息返回给调用方。 - 当应用组件通过调用
bindService()绑定到服务时,服务处于绑定状态,这种状态的服务提供一个client-server(即客户-服务器)接口,组件可以通过发送请求给服务来实现与服务的交互,服务可以返回信息给绑定了服务的组件。多个组件可以绑定同一个服务,而在绑定到服务的全部组件都解绑后,服务将被销毁。
服务既可以以启动状态运行,也可以以绑定状态运行,也可以同时以两种状态运行(即服务既提供交互接口,又可以无限期运行)。一个服务可以以何种状态运行取决于是否实现了相应的回调方法:onStart()(允许组件启动服务)和 onBind()(允许组件绑定服务)。当内存过低且系统必须回收资源供具有用户焦点的Activity使用时,Android 系统可能会强制停止服务。
Service基本用法
- 注册
- 在AndroidManifest中使用
<service.../>标签,例如:
<manifest ... > ... <application ... > <service android:name=".DemoService" /> ... </application> </manifest>- 可以在此时声明服务为私有服务,阻止其他应用访问服务
- 在AndroidManifest中使用
- 创建
- 建立相应的Service实现类
- 加载
- 通过
startService()/bindService()启动服务
- 通过
Service生命周期
两种方式(启动状态/绑定状态)启动的Service生命周期如下所示:
通过onStart()启动的服务,将通过stopSelf()或stopService()停止服务。onBind()方法需要返回一个IBinder来提供交互接口,以供客户与服务器通信。
Service与Activity通信
详见详解Android Service与Activity之间通信的几种方式
-
通过
Binder- 定义
Binder子类,实现getService()方法,返回Service对象 - 实现
Service类的onBind()方法,返回Binder对象 - Activity类中实例化
ServiceConnection对象,并实现onServiceConnected()方法 - Activity调用
bindService()方法得到Service实例,调用Service的方法实现通信
- 定义
-
通过
Broadcast- 在
Service类中发送广播 - 在Activity类中实现广播接收器并注册广播
- 在