Service是标准应用组件之一,适用于长期运行,且无需用户交互的任务;或者提供可供其他应用使用的功能
类型
- Normal Service
- IntentService
IntentService是一种处理通过Intent传递的异步请求的服务,Client通过startService(Intent)
发起请求,如果对应服务已经启动,则该请求会放到请求队列中;如果对应服务没有启动,则先启动服务,再处理请求。请求是在onHandleIntent(Intent)
函数中处理,该函数运行在一个由IntentService自动启动的worker thread中。请求队列中的所有请求都是在这个相同的thread中顺序处理。当所有请求都处理完后,IntentService会自行退出。
启动方式
-
startService(Intent)
Intent必须是显式的,包含具体的class name或者服务所在的包名。用这种方式启动的服务必须调用stopSelf
或者stopService
才能正常退出。 -
bindService(Intent)
Intent可以是显式的;也可以是隐式的,且匹配服务在manifest中声明的intent filter。用这种方式启动的服务,只有第一次绑定,服务启动时,会执行onBind
回调,之后再次绑定服务,系统会直接返回第一次绑定时onBind
返回的IBinder。绑定服务的Client销毁后系统会自动unBind
,但推荐Client不需要服务时就立刻调用unBind
。当所有的Client都unBind
之后,服务会自行退出。
交互方式
- Intent
适用于进程间和进程内通信,用于启动或绑定服务 - Binder
进程内通信时,可以调用Service的接口;进程间通信时,可以利用IBinder.transact
和Binder.onTransact
传递数据 - Messenger
适用于进程间通信,但只能是Client单向向Service发送消息。 - AIDL
使用于进程间通信,Client可以同步或异步(keyword in aidl: oneway)调用Service的接口。