三种不同的服务类型
- 前台:前台服务执行一些用户能注意到的操作,如播放音乐
- 后台:后台服务执行用户不会直接注意到的操作。如下载
- 绑定:当应用组件通过调用
bindService
绑定到服务时,服务即处于绑定
状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
Service生命周期
image.png支持绑定Service的三个组件
- Activity
- Services(没错,服务绑定服务)
- ContentProviders
BroadcastReceiver不能绑定Service
创建绑定服务通信
-
扩展 Binder 类
如果服务只是同个进程通信,应优先采用这种方式。您不使用这种方式创建接口的唯一一种情况是:其他应用或不同进程占用了您的服务。 -
使用 Messenger
这是执行进程间通信 (IPC) 最为简单的方式,因为[Messenger](https://developer.android.google.cn/reference/android/os/Messenger)
会在单个线程中创建包含所有请求的队列,这样您就不必对服务进行线程安全设计。 -
使用 AIDL
大多数应用不应使用 AIDL 来创建绑定服务,因为它可能需要多线程处理能力,并可能导致更为复杂的实现。因此,AIDL 并不适合大多数应用,本文也不会阐述如何将其用于您的服务。如果您确定自己需要直接使用 AIDL
其他
- Service默认在主线程运行
- 从Android5.0开始如果使用隐式 Intent 调用
bindService()
,则系统会抛出异常 - 您可以通过添加
android:exported
属性并将其设置为false
,确保服务仅适用于您的应用。这可以有效阻止其他应用启动您的服务,即便在使用显式 Intent 时也如此。 -
IntentService
如果您不要求服务同时处理多个请求,此类为最佳选择
网友评论