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文档。

参考资料

  API Guides:Services

  http://developer.android.com/guide/components/services.html

  API Guides:Bound Services

  http://developer.android.com/guide/components/bound-services.html

Android Service的绑定 基础概念篇相关推荐

  1. Android camera(4)---Android Camera开发之基础知识篇

    Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...

  2. 【软件测试】基础-概念篇

    软件测试基础-概念篇 记录 - 慕课网 imooc 软件测试基础-概念篇 简介:系统介绍什么是软件测试,从软件测试的定义.原则以及测试阶段.测试模式.测试手段和测试类型分别详细说明软件测试中的各种测试 ...

  3. C++面试题(一)——基础概念篇

    https://blog.csdn.net/worldwindjp/article/details/18909079 C++面试题--基础概念篇 唐璐 http://blog.csdn.net/wor ...

  4. 模型推理部署——基础概念篇

    模型推理部署--基础概念篇 训练(training)vs推理(inference) 训练是通过从已有的数据中学习到某种能力,而推理是简化并使用该能力,使其能快速.高效地对未知的数据进行操作,以获得预期 ...

  5. Python+Dash快速web应用开发——基础概念篇

    作者:费弗里 来源:Python大数据分析 ❝本文示例代码与数据已上传至https://github.com/CNFeffery/DataScienceStudyNotes ❞ 1 简介 这是我的新系 ...

  6. [转载] 网络游戏程序员须知 基础概念篇

    转载自:https://blog.csdn.net/rellikt/article/details/5878447 本文为作者原创或翻译,转载请注明,不得用于商业用途. 作者:rellikt@gmai ...

  7. 数据集成之主数据管理(一)基础概念篇

    数据集成是当下比較热门的话题,相关的产品和平台也越来越多.非常多CIO都在各种数据集成平台和产品之间犹豫不决.因此对数据集成平台的框架体系有全面的理解,对各个厂家产品所提供的功能有深入的认识才干为数据 ...

  8. haproxy小结(一)基础概念篇

    HAProxy是法国人Willy Tarreau个人开发的一个开源软件,目标是应对客户端10000以上的同时连接,为后端应用服务器.数据库服务器提供高性能的负载均衡服务.HAproxy可以实现基于TC ...

  9. 【Linux系统管理】10 Shell 基础概念篇

    一 Shell 概述 1.1 什么是 Shell Shell 只要可以实现功能(不考虑效率的情况)即可.Shell 需要对 Linux系统比较熟悉才能使用得当. Shell 编程主要为了帮助运维人员实 ...

最新文章

  1. windows10下使用wget命令(安装失败,请大家提意见)
  2. wxWidgets:在带有 DC 的面板上绘图
  3. [py2neo]Ubuntu14 安装py2neo失败问题解决
  4. 关于 ABAP 调试器里的 16 进制值的显示问题
  5. LeetCode 1290 二进制链表转整数
  6. Matlab将一矩阵中等于某个值的元素全部替换成另一个值
  7. TypeError: 'str' object is not callable (Python)
  8. APUE学习笔记-守护进程的创建
  9. 河津市新世纪计算机学校元旦晚会,运城最好的职中排名
  10. natapp外网穿透使用教程Windows
  11. spss数据统计分析工具IBM SPSS Statistics 26 for Mac安装教程
  12. 为什么开发人员都看不起运维工程师?
  13. 【UE5】使用快捷键切换编辑器中英文设置
  14. 手机中的com.android.provision删除可不可以,Android Provision (Setup Wizard)
  15. 解除Windows XP IIS 10个并发连接数的限制
  16. OLED显示字符的大小与PCtoLCD2002生成字模
  17. BandZIP无广告版(v6.25)安装及禁止联网设置
  18. npm 安装依赖报错解决方法总结
  19. 视频时序动作识别(video action recognition)介绍
  20. 2019南昌网络赛 H. The Nth Item(广义斐波那契数列求通项公式模板)(二次剩余+分块)

热门文章

  1. pyinstaller深入使用,打包指定模块,打包静态文件
  2. Codeforces Round #323 (Div. 2) C. GCD Table
  3. call_user_func_array 笔记
  4. 网站基于文本搜索的实现
  5. 使用R语言对照片人物进行情绪分析
  6. vue后台增删改查_Vue 原生实现商城购物车增删改查
  7. hbase查看表结构_HBase
  8. 人脸特征值能存放在sql server中吗_钥匙丢了进不了门,Out了!只要自己没丢就能进门...
  9. 嵌入式linux 用虚拟机,如何制作嵌入式Linux虚拟机
  10. onpostexecute 中更新adapter 事变_Spring面试中常见的9种设计模式!