【转】绑定Service详解

转载 2015年11月18日 16:28:39

Creating a Bound Service

绑定Service的作用:

  一个绑定的service(bound service)是客户端-服务器接口中的服务器。

  绑定的service允许组件(比如activity)通过调用bindService()方法和其进行绑定,建立一个长期存在的连接关系,发送请求,接收回应,甚至执行跨进程的通信(interprocess communication (IPC))。

  当你需要从应用中的activity或者其他组件和service进行交互的时候,或者当你需要把应用中的一些功能通过跨进程的通信interprocess communication (IPC)暴露给其他的应用时,你应该建立一个绑定的service。

绑定Service的一般性实现:

  一个绑定的service是 Service类的一个实现,允许其他的组件和其进行绑定并交互。

  为了创建一个绑定的service,你必须做的第一件事是定义一个接口,指定客户如何和这个service进行交互。

  这个接口必须是IBinder接口的一个实现,并且是你的 onBind()回调方法返回的东西。

  所以,为了提供绑定,你首先必须实现onBind()回调方法,这个方法返回一个IBinder对象。

  其他组件可以调用bindService()方法来取得这个接口,然后就可以开始调用service中的方法。

  具体来说,一个客户端通过bindService()方法和service进行绑定。当客户端这样做的时候,它必须提供一个ServiceConnection的实现,用来监听和service之间的连接。

  bindService()方法会立即返回,当Android系统创建了客户端和service之间的连接时,系统会调用ServiceConnection中的 onServiceConnected(),来传递 IBinder 对象,让客户端用来和service通信。

多个客户端绑定与生命周期的结束行为:

  一个service可以同时和多个客户端进行连接。

  但是,系统仅在第一次连接的时候调用service的onBind() 方法来获取IBinder对象。

  系统会将同一个IBinder对象传递给其他后来增加的客户端,不再调用onBind() 方法。

  当一个客户完成和service之间的互动后,它调用 unbindService() 方法来解除绑定。

  当所有的客户端都和service解除绑定后,系统会销毁service。(除非service也被startService()方法开启)。

  因为,通常情况下,一个绑定的service仅当它为其他组件服务时存在,所以当没有任何组件和其绑定时,系统会销毁它,不会在后台无限运行。你不需要去停止一个绑定的service。

  有很多方法来实现一个绑定的service,这个实现比开启的service要复杂。下面介绍三种方法。

Creating a Bound Service

  当创建一个提供绑定的service时,你必须提供给一个IBinder,来提供客户和service交互的接口。

  有三种方法可以定义这个接口:

1.继承Binder类

  如果你的service是你的应用所私有的,并且和客户端在同一个进程中运行,你应该通过继承Binder 类来创建接口,在 onBind()方法中返回它的实例。

  客户端接收到这个Binder对象,并且可以直接使用它来访问一些Binder甚至service中的public方法。

  当你的service仅仅是你的应用中的一个后台工作者时,这种方法是被推荐的。

  不使用这种方法创建接口的唯一理由就是你的service需要被其他应用使用,或者需要跨进程使用。

2.使用一个Messenger

  如果你需要你的接口跨进程使用,你可以使用 Messenger来创建接口。

  用这种方式,service定义一个 Handler用来响应不同类型的 Message 对象。

  这个Handler是 Messenger和客户分享一个 IBinder的基础,让客户端可以使用Message 对象向service发送命令。

  另外,客户端也可以定义自己的Messenger,这样service就可以发送信息给客户端。

  这是执行跨进程通信(interprocess communication (IPC))的最简单的方法,因为Messenger把所有的请求排列进一个单独的线程,所以你在设计service时不用为了线程安全而做特殊的设计。

3.使用AIDL

  AIDL (Android Interface Definition Language)执行分解对象的工作,它把对象分解成primitives,操作系统可以理解并将这些primitives跨进程分组(marshall)来执行IPC。

  前面使用Messenger的方法底层结构实际上是基于AIDL的。

  上面提到,Messenger在一个单独的线程中创建一个所有客户端请求的队列,所以service一次只接收一个请求。

  然而,如果你想要你的service同时处理多个请求,那么你可以直接使用AIDL。

  这种情况下,你的service必须能够处理多线程并且是线程安全的。

  要直接使用AIDL,你必须创建一个.aidl文件,定义编程接口。Android SDK使用这个文件来生成抽象类,实现接口和处理IPC,你可以在你的service中继承它。

  注意:多数应用不应该使用AIDL去创建一个bound service,因为它需要多线程,会导致一个复杂得多的实现。如果你确定要使用,可以查看 AIDL文档。

Service绑定模式

Service绑定模式      使用绑定的Service可以实现组件与Service的通信。      组件与被绑定的Service可以不归属于同一个应用程序,因此通过绑定Service可以实现...
  • wojiaohuangyu
  • wojiaohuangyu
  • 2015年12月27日 10:08
  • 1664

Android:Service(二)——以绑定方式启动Service

关于Service的线程问题 上一篇说了Service的基本使用:Android:Service(一)——Service的基本使用,其中有一点没有提到的是:在service上运行的任务也是运行在主线程...
  • javy_codercoder
  • javy_codercoder
  • 2015年11月05日 15:17
  • 2660

如何将service与activity绑定

一、 service的简单使用就不详细展开了。只做一点儿讨论以解释为什么要绑定activity。 service是不可见的,它的启动、停止和其他控制操作都是通过其他应用程序组件来实现的。 比如最简单的...
  • liyuchong2537631
  • liyuchong2537631
  • 2015年09月14日 16:32
  • 947

Android三种绑定Service方式的demo

Android的Service提供给我们强大的后台处理能力,并可以用其qij
  • lttclaw_
  • lttclaw_
  • 2014年10月04日 14:17
  • 2960

用BroadcastReceiver控制Service

概述 通过在Service类的内部定义BroadcastReceiver对象,接收外部发送的广播,也可以达到控制Service的目的。 操作步骤 步骤1、自定义Service的子类。 ...
  • zeng622peng
  • zeng622peng
  • 2014年11月04日 14:54
  • 1756

Service与多个Activity交互

Service通过Broadcast与多个Activity进行交互
  • zhufeng1222
  • zhufeng1222
  • 2015年08月28日 12:00
  • 2451

android 将Service绑定到Activity

Service可以和Activity绑定,后者会维持对Service实例的引用,此引用允许你像对待其他实例化的那样,对正在运行的Service进行方法调用。 允许Service和Activity绑定...
  • howlaa
  • howlaa
  • 2014年07月26日 13:22
  • 1575

Android:Service(三)——Aidl绑定远程服务

远程服务 什么是远程服务呢?远程服务笔者觉得是相对于本地服务来说的。本地服务就是运行在同一个进程上的服务,而远程服务就是运行在其它进程上的服务。 不同进程间的数据一般都是独立的,若要在不同进程间通讯就...
  • javy_codercoder
  • javy_codercoder
  • 2015年11月06日 10:08
  • 1552

Android:Service的绑定和解绑定,Service与Activity通信

先看一张原理图:1.先从Activity绑定Service,如果Service还没被创建,则Service会调用onCreate()方法,然后再调用onBind()的的方法; 2.然后onBind(...
  • vrinux
  • vrinux
  • 2015年03月12日 23:53
  • 2573

android Service的启动方式和重复绑定

重复绑定的条件: onUnbind(Intent intent);方法返回值为true. 服务中没有onDestroy();方法。...
  • jeff2016yang
  • jeff2016yang
  • 2016年05月21日 10:08
  • 408
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【转】绑定Service详解
举报原因:
原因补充:

(最多只允许输入30个字)