Android 进程间通信——Service、Messenger

转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/74198534

Android四大组件(二)Service
接着上一篇Service基础知识,这一篇主要说下介绍下绑定的服务端的三种方式:同一进程绑定服务、跨进程绑定服务(Messenger)、跨进程绑定服务(aidl)。
重点说一下通过Messenger、Service实现的进程间通信。
demo下载地址 http://www.demodashi.com/demo/10611.html


1 基础

bound服务是客户端 - 服务器结构中的服务器。 bound服务允许组件(如Activity)绑定到服务,发送请求,接收响应,甚至执行进程间通信(IPC)。 绑定的服务通常仅服务于另一个应用程序组件,并且不会无限期地在后台运行。
bound服务是Service类的一个实现,它允许其他应用程序绑定到它并与之交互。 要提供绑定服务,您必须实现onBind()回调方法。 此方法返回一个IBinder对象,该对象定义了客户端与服务进行交互的编程接口。

客户端可以通过调用bindService()绑定到该服务。当它这样做时,它必须实现ServiceConnection,监视与服务的连接。 bindService()方法立即返回,返回值为boolean类型,并不能代表是否绑定成功,但是当Android系统创建客户端和服务之间的连接时,它会回调ServiceConnection上的onServiceConnected()来传递给客户端IBinder对象,客户端可通过IBinder对象与服务通信。
多个客户端可以全部连接到该服务。但是,系统只会在第一个客户端绑定时调用您的服务的onBind()方法来检索IBinder。系统然后将相同的IBinder传递给绑定的任何其他客户端,而无需再次调用onBind()。
当最后一个客户端解除绑定服务时,系统会销毁该服务(除非该服务也由startService()启动)。

实现绑定服务时,最重要的部分是定义onBind()回调方法返回的接口。您可以通过几种不同的方法来定义服务的IBinder接口,以下部分将讨论每种技术。


2 绑定服务方式

在创建提供绑定的Service时,必须提供一个IBinder (客户端可以用来与服务进行交互的编程接口)。有三种方法可以定义接口:

  • 扩展Binder类
    如果您的Service对您自己的应用程序是私有的,并且与客户端在相同的进程中运行(这是常见的),则应该通过扩展Binder类并创建其实例,onBind()返回该实例。 客户端收到Binder,可以使用它直接访问Binder实现或甚至Service中可用的公共方法。
    当您的服务只是您自己的应用程序的后台工作者时,这是首选技术。您不会以这种方式创建界面的唯一原因是因为您的服务被其他应用程序或单独的进程使用。
  • 使用Messenger
    如果您需要Service 和客户端位于不同的进程,则可以使用Messenger为服务创建一个interface。 以这种方式,服务定义响应不同类型的Message对象的Handler。 该Handler是Messenger的基础,可以与客户端共享IBinder,允许客户端使用Message对象向服务发送命令。 此外,客户端可以定义自己的Messenger,因此服务可以发回消息。
    这是执行进程间通信(IPC)的最简单的方法,因为Messenger将所有请求排队到单个线程中,以便您不必将服务设计为线程安全。
  • 使用AIDL
    AIDL(Android Interface Definition Language)执行所有的工作,将对象分解为基元,操作系统可以在进程之间了解和编组它们以执行IPC。 之前使用的Messenger技术实际上是基于AIDL作为其底层结构。 如上所述,Messenger在单个线程中创建所有客户端请求的队列,因此服务一次接收一个请求。 但是,如果您希望您的服务同时处理多个请求,则可以直接使用AIDL。 在这种情况下,您的服务必须能够进行多线程并建立线程安全。
    要直接使用AIDL,您必须创建一个定义编程接口的.aidl文件。 Android SDK工具使用此文件生成一个实现接口并处理IPC的抽象类,然后您可以在服务中扩展它。

注意:大多数应用程序不应该使用AIDL创建绑定的服务,因为它可能需要多线程功能,并可能导致更复杂的实现。因此,AIDL不适用于大多数应用程序。

3 扩展Binder类

如果您的服务仅由本地应用程序使用,并且不需要跨进程工作,那么您可以实现自己的Binder类,为客户端直接访问服务中的公共方法。

注意:只有当客户端和服务处于相同的应用程序和进程中时,这是最常见的。 例如,将Activity绑定到其自己的Service对于需要在后台播放音乐的音乐应用程序将是有效的。

具体使用方法:

  1. 在您的服务中,创建一个或多个实例Binder:
    包含客户端可以调用的公共方法
    返回当前Service实例,该实例具有客户端可以调用的公共方法
    或者,使用客户端可以调用的公共方法返回由服务托管的另一个类的实例
  2. Binder从onBind()回调方法返回此实例。
  3. 在客户端中,Binder从onServiceConnected()回调方法接收并使用提供的方法调用绑定的服务。

以下是一种通过Binder实现为客户端访问服务中的方法的服务:

public class LocalService extends Service {
   
    // 创建IBinder对象
    private final IBinder mBinder = new LocalBinder();
    // Random number generator
    private final Random mGenerator = <
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值