为什么要绑定Service?
Android的在服务器-客户端模式大量使用了Service绑定。绑定Service的好处就是你可以向Service发送、接收请求,甚至可以跨进程通信(IPC)。被绑定的服务通常是为了其他进程服务,而不是正常情况下的后台处理事件。
绑定Service的办法
在客户端中使用bindService (Intent service, ServiceConnection conn, int flags)
。
其中几个参数分别意义为:
Intent
: 指向绑定Service的Intent。若是在其他进程中的Service,需要调用Intent.setComponent(new ComponentName(String packageName, String className))
来指定Service。
ServiceConnection
:提供绑定连接的接口,有两个方法必须实现:
onServiceConnected(ComponentName name, IBinder service)
在连接建立时被调用的函数,参数意义如下:
name 被绑定服务的具体名,格式:”ComponentInfo{app_package/service_package.service_class}”。
service 服务的
onBind
方法所返回的IBinder
,可以用来与服务通信。
onServiceDisconnected(ComponentName name)
在连接断开时被调用的函数,参数name与
onServiceConnected
中含义相同。
flags
: Context类下的常量,具体意义如下表
常量名 | 值 | 含义 |
---|---|---|
BIND_ABOVE_CLIENT | 8 | 如果当绑定服务期间遇到OOM需要杀死进程,客户进程会先于服务进程被杀死。 |
BIND_ADJUST_WITH_ACTIVITY | 128 | 允许客户进程提升被绑定服务进程的优先级 |
BIND_ALLOW_OOM_MANAGEMENT | 16 | 如果绑定服务期间遇到OOM需要杀死进程,被绑定的服务进程会被OOM列入猎杀对象中。 |
BIND_AUTO_CREATE | 1 | 若绑定服务时服务未启动,则会自动启动服务。 注意,这种情况下服务的onStartCommand 仍然未被调用(它只会在显式调用startService 时才会被调用)。 |
BIND_DEBUG_UNBIND | 2 | 使用此标志绑定服务之后的unBindService 方法会无效。 这种方法会引起内存泄露,只能在调试时使用。 |
BIND_IMPORTANT | 64 | 被绑定的服务进程优先级会被提到 |