Android 之绑定服务

本文主要介绍了Android中绑定服务的概念,强调了绑定服务在客户端与服务交互中的作用,特别是如何创建和管理绑定服务。创建绑定服务时,可以扩展Binder类、使用Messenger或AIDL来定义接口。客户端通过bindService()与服务建立连接,并通过ServiceConnection的onServiceConnected()获取服务的IBinder。当所有客户端取消绑定后,系统可能会销毁服务,除非它也被startService()启动。
摘要由CSDN通过智能技术生成

介绍

    绑定服务是客户端-服务器接口中的服务器。绑定服务可让组件(例如 Activity)绑定到服务、发送请求、接收响应,甚至执行进程间通信 (IPC)。 绑定服务通常只在为其他应用组件服务时处于活动状态,不会无限期在后台运行。

    本文向您介绍如何创建绑定服务,包括如何绑定到来自其他应用组件的服务。 不过,您还应参阅服务文档,了解有关一般服务的更多信息,例如:如何利用服务传送通知、如何将服务设置为在前台运行等等。

基础知识

    绑定服务是 Service 类的实现,可让其他应用与其绑定和交互。要提供服务绑定,您必须实现 onBind() 回调方法。该方法返回的 IBinder 对象定义了客户端用来与服务进行交互的编程接口。

    绑定到已启动服务:

    正如服务文档中所述,您可以创建同时具有已启动和绑定两种状态的服务。 也就是说,可通过调用 startService() 启动该服务,让服务无限期运行;此外,还可通过调用 bindService() 使客户端绑定到服务。

    如果您确实允许服务同时具有已启动和绑定状态,则服务启动后,系统“绝对不会”在所有客户端都取消绑定时销毁服务。 为此,您必须通过调用 stopSelf() 或 stopService() 显式停止服务。

    尽管您通常应该实现 onBind() 或 onStartCommand(),但有时需要同时实现这两者。例如,音乐播放器可能发现让其服务无限期运行并同时提供绑定很有用处。 这样一来,Activity 便可启动服务进行音乐播放,即使用户离开应用,音乐播放也不会停止。 然后,当用户返回应用时,Activity 可绑定到服务,重新获得回放控制权。

    请务必阅读管理绑定服务的生命周期部分,详细了解有关添加绑定已启动服务时该服务的生命周期信息。

    客户端可通过调用 bindService() 绑定到服务。调用时,它必须提供 ServiceConnection 的实现,后者会监控与服务的连接。bindService() 方法会立即无值返回,但当 Android 系统创建客户端与服务之间的连接时,会调用 ServiceConnection 上的 onServiceConnected(),向客户端传递用来与服务通信的 IBinder。

    多个客户端可同时连接到一个服务。不过,只有在第一个客户端绑定时,系统才会调用服务的 onBind() 方法来检索 IBinder。系统随后无需再次调用 onBind(),便可将同一 IBinder 传递至任何其他绑定的客户端。

    当最后一个客户端取消与服务的绑定时,系统会将服务销毁(除非 startService() 也启动了该服务)。

    当您实现绑定服务时,最重要的环节是定义您的 onBind() 回调方法返回的接口。您可以通过几种不同的方法定义服务的 IBinder 接口,下文对这些方法逐一做了阐述。

创建绑定服务

    创建提供绑定的服务时,您必须提供 IBinder,用以提供客户端用来与服务进行交互的编程接口。 您可以通过三种方法定义接口:

  • 扩展 Binder 类:
        如果服务是供您的自有应用专用,并且在与客户端相同的进程中运行(常见情况),则应通过扩展 Binder 类并从 onBind() 返回它的一个实例来创建接口。客户端收到 Binder 后,可利用它直接访问 Binder 实现中乃至 Service 中可用的公共方法。
        如果服务只是您的自有应用的后台工作线程,则优先采用这种方法。 不以这种方式创建接口的唯一原因是,您的服务被其他应用或不同的进程占用。
  • 使用 Messenger:
        如需让接口跨不同的进程工作,则可使用 Messenger 为服务创建接口。服务可以这种方式定义对应于不同类型 Message 对象的 Handler。此 Handler 是 Messenger 的基础,后者随后可与客户端分享一个 IBinder,从而让客户端能利用 Message 对象向服务发送命令。此外,客户端还可定义自有 Messenger,以便服务回传消息。
        这是执行进程间通信 (IPC) 的最简单方法,因为 Messenger 会在单一线程中创建包含所有请求的队列,这样您就不必对服务进行线程安全设计。
  • 使用 AIDL:
        AIDL(Android 接口定义语言)执行所有将对象分解成原语的工作,操作系统可以识别这些原语并将它们编组到各进程中,以执行 IPC。之前采用 Messenger 的方法实际上是以 AIDL 作为其底层结构。如上所述,Messenger 会在单一线程中创建包含所有客户端请求的队列,以便服务一次接收一个请求。不过,如果您想让服务同时处理多个请求,则可直接使用 AIDL。 在此情况下,您的服务必须具备多线程处理能力,并采用线程安全式设计。
        如需直接使用 AIDL,您必须创建一个定义编程接口的 .aidl 文件。Android SDK 工具利用该文件生成一个实现接口并处理 IPC 的抽象类,您随后可在服务内对其进行扩展。

    注:大多数应用“都不会”使用 AIDL 来创建绑定服务,因为它可能要求具备多线程处理能力,并可能导致实现的复杂性增加。因此,AIDL 并不适合大多数应用,本文也不会阐述如何将其用于您的服务。如果您确定自己需要直接使用 AIDL,请参阅 AIDL 文档。

Android 中,可以通过绑定服务(Binding Service)来实现应用程序组件间的通信。绑定服务允许一个组件(例如活动或服务)与另一个服务组件(Service组件)建立连接,并与之进行交互。 要绑定服务,需要遵循以下步骤: 1. 创建服务组件:创建一个服务组件,实现需要提供的功能,并在其onBind()方法中返回一个IBinder对象,该对象用于与绑定组件进行交互。 2. 绑定服务:通过调用Context的bindService()方法来绑定服务。此方法需要传入一个Intent对象和一个ServiceConnection对象。Intent对象指定要绑定服务,ServiceConnection对象用于处理与服务之间的连接和断开连接。 3. 与服务交互:一旦绑定服务成功,就可以使用IBinder对象与服务进行交互。在绑定服务时,ServiceConnection对象的onServiceConnected()方法将被调用,其中的IBinder参数就是服务返回的IBinder对象。 4. 解除绑定:当不再需要与服务交互时,可以通过调用unbindService()方法解除绑定。这将导致ServiceConnection对象的onServiceDisconnected()方法被调用,以通知绑定组件与服务的连接已经断开。 示例代码如下: ```java // 创建服务组件 public class MyService extends Service { // 实现需要提供的功能 @Override public IBinder onBind(Intent intent) { return new MyBinder(); } public class MyBinder extends Binder { // 公开的方法供绑定组件调用 public void doSomething() { // 处理逻辑 } } } // 绑定服务 public class MyActivity extends Activity { private MyService.MyBinder mBinder; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBinder = (MyService.MyBinder) service; // 与服务交互 mBinder.doSomething(); } @Override public void onServiceDisconnected(ComponentName name) { mBinder = null; } }; @Override protected void onStart() { super.onStart(); // 绑定服务 Intent intent = new Intent(this, MyService.class); bindService(intent, mConnection, BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); // 解除绑定 unbindService(mConnection); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值