绑定服务
如果您的服务仅供本地应用使用,不需要跨进程工作,则可以实现自有Binder
类,让您的客户端通过该类直接访问服务中的公共方法。
注:此方法只有在客户端和服务位于同一应用和进程内这一最常见的情况下方才有效。 例如,对于需要将 Activity 绑定到在后台播放音乐的自有服务的音乐应用,此方法非常有效。
以下是具体的设置方法:
- 在您的服务中,创建一个可满足下列任一要求的
Binder
实例:
- 包含客户端可调用的公共方法
- 返回当前 Service 实例,其中包含客户端可调用的公共方法
- 或返回由服务承载的其他类的实例,其中包含客户端可调用的公共方法
- 从 onBind() 回调方法返回此
Binder
实例。 - 在客户端中,从
onServiceConnected()
回调方法接收Binder
,并使用提供的方法调用绑定服务。
AIDL
AIDL
是Android中IPC(Inter-Process Communication)进程间通信
方式中的一种,AIDL
是Android Interface Definition Language
Android 接口定义语言的缩写,简单来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的Service
,这样你的APP可以和其他APP交互,调用其它APP里服务的方法。
如果您想让被调用服务同时处理多个请求,则可直接使用AIDL
。 在此情况下,您的服务必须具备多线程处理能力,并采用线程安全式设计。
- 在提供远程服务的服务端应用里新建
AIDL
文件,其实就是一个接口,里面定义了可以被调用的方法。
然后rebuild项目,Android studio将在app/build/generated/source/aidl/debug/[包名]/
里生成一个与AIDL
文件同名的Java文件,你可以进去看看,这个自动生成的文件不要改动。
生成的Java文件里可以看到一个Stub
抽象类,该类继承了Binder
,实现了你刚刚定义的接口,看到Binder
就知道之后的步骤和绑定服务的步骤大同小异了。 - 在服务端应用里创建欲提供远程服务的
Service
,写一个内部类继承刚刚生成的Java文件里的Stub
类,复写接口里的的方法,这就是被调用的方法,onBind()
返回Binder
中间人对象,在清单文件里配置服务的intent-filter
和action
,用于被启动,被调用的方法里不能做UI操作哦,还有获取到中间人对象那条语句是异步的,可以把调用中间人对象方法的操作放在Connect里。 - 现在,把
AIDL
文件复制到客户端应用里,同样的,客户端应用里也会自动生成一个与AIDL
文件同名的Java文件,当然,Java文件里的包名和服务端的相同。 - 之后的步骤就是绑定服务第二和第三步一样了,
onCreate()
绑定服务,还要记得在onDestroy()
里解绑服务哦,通过客户端的服务action
来创建Intent
,Android 5.0以上还要setPackage(“服务端Service的包名”);