Android Service的绑定 基础概念篇
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的绑定 基础概念篇相关推荐
- Android camera(4)---Android Camera开发之基础知识篇
Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...
- 【软件测试】基础-概念篇
软件测试基础-概念篇 记录 - 慕课网 imooc 软件测试基础-概念篇 简介:系统介绍什么是软件测试,从软件测试的定义.原则以及测试阶段.测试模式.测试手段和测试类型分别详细说明软件测试中的各种测试 ...
- C++面试题(一)——基础概念篇
https://blog.csdn.net/worldwindjp/article/details/18909079 C++面试题--基础概念篇 唐璐 http://blog.csdn.net/wor ...
- 模型推理部署——基础概念篇
模型推理部署--基础概念篇 训练(training)vs推理(inference) 训练是通过从已有的数据中学习到某种能力,而推理是简化并使用该能力,使其能快速.高效地对未知的数据进行操作,以获得预期 ...
- Python+Dash快速web应用开发——基础概念篇
作者:费弗里 来源:Python大数据分析 ❝本文示例代码与数据已上传至https://github.com/CNFeffery/DataScienceStudyNotes ❞ 1 简介 这是我的新系 ...
- [转载] 网络游戏程序员须知 基础概念篇
转载自:https://blog.csdn.net/rellikt/article/details/5878447 本文为作者原创或翻译,转载请注明,不得用于商业用途. 作者:rellikt@gmai ...
- 数据集成之主数据管理(一)基础概念篇
数据集成是当下比較热门的话题,相关的产品和平台也越来越多.非常多CIO都在各种数据集成平台和产品之间犹豫不决.因此对数据集成平台的框架体系有全面的理解,对各个厂家产品所提供的功能有深入的认识才干为数据 ...
- haproxy小结(一)基础概念篇
HAProxy是法国人Willy Tarreau个人开发的一个开源软件,目标是应对客户端10000以上的同时连接,为后端应用服务器.数据库服务器提供高性能的负载均衡服务.HAproxy可以实现基于TC ...
- 【Linux系统管理】10 Shell 基础概念篇
一 Shell 概述 1.1 什么是 Shell Shell 只要可以实现功能(不考虑效率的情况)即可.Shell 需要对 Linux系统比较熟悉才能使用得当. Shell 编程主要为了帮助运维人员实 ...
最新文章
- windows10下使用wget命令(安装失败,请大家提意见)
- wxWidgets:在带有 DC 的面板上绘图
- [py2neo]Ubuntu14 安装py2neo失败问题解决
- 关于 ABAP 调试器里的 16 进制值的显示问题
- LeetCode 1290 二进制链表转整数
- Matlab将一矩阵中等于某个值的元素全部替换成另一个值
- TypeError: 'str' object is not callable (Python)
- APUE学习笔记-守护进程的创建
- 河津市新世纪计算机学校元旦晚会,运城最好的职中排名
- natapp外网穿透使用教程Windows
- spss数据统计分析工具IBM SPSS Statistics 26 for Mac安装教程
- 为什么开发人员都看不起运维工程师?
- 【UE5】使用快捷键切换编辑器中英文设置
- 手机中的com.android.provision删除可不可以,Android Provision (Setup Wizard)
- 解除Windows XP IIS 10个并发连接数的限制
- OLED显示字符的大小与PCtoLCD2002生成字模
- BandZIP无广告版(v6.25)安装及禁止联网设置
- npm 安装依赖报错解决方法总结
- 视频时序动作识别(video action recognition)介绍
- 2019南昌网络赛 H. The Nth Item(广义斐波那契数列求通项公式模板)(二次剩余+分块)
热门文章
- pyinstaller深入使用,打包指定模块,打包静态文件
- Codeforces Round #323 (Div. 2) C. GCD Table
- call_user_func_array 笔记
- 网站基于文本搜索的实现
- 使用R语言对照片人物进行情绪分析
- vue后台增删改查_Vue 原生实现商城购物车增删改查
- hbase查看表结构_HBase
- 人脸特征值能存放在sql server中吗_钥匙丢了进不了门,Out了!只要自己没丢就能进门...
- 嵌入式linux 用虚拟机,如何制作嵌入式Linux虚拟机
- onpostexecute 中更新adapter 事变_Spring面试中常见的9种设计模式!