Binding to a Service
应用组件(客户端)可以通过 bindService()
方法绑定到service,Android系统随后会调用service的 onBind()
方法,返回一个 IBinder
用于和service交互。
绑定过程是异步的(asynchronous) , bindService()
方法会立即返回,但是不会返回IBinder对象给客户端。
为了接收到IBinder,客户端必须创建一个ServiceConnection的实例,并且把它传给 bindService()
,这个 ServiceConnection
中会包含一个回调函数,系统调用它来传递 IBinder
对象。
注意:仅仅是activity,service和content provider可以和service绑定,你不能把一个broadcast receiver和一个service绑定。
为了将客户端和service绑定,你必须:
其中需要实现两个回调方法:
系统调用这个方法来传递service的onBind()
方法返回的 IBinder
。
当和service的连接意外丢失时,系统会调用这个方法。如果是客户端解除绑定,系统不会调用这个方法。
2.调用 bindService()
,并传递 ServiceConnection
的实现。
3.当系统调用你的 onServiceConnected()
,你可以开始用接口定义的方法访问service。
4.要断开连接,调用 unbindService()
。
当你的客户端被销毁的时候,会断开与service的连接,但是你应该在停止与service的交互时断开连接或者当activity暂停时断开连接,这样service就可以在它不被使用的时候关闭。
Additional notes
1.注意 DeadObjectException
异常,它会在连接断开时被抛出。
2.对象是整个进程计数的引用。(Objects are reference counted across processes.)
3.绑定和解除绑定应该在客户端生命周期中建立和销毁的对等时间执行。
比如:
如果你只需要在activity可见的时候和service交互,你应该在onStart()绑定,在 onStop()
中解除绑定。
如果你想要你的activity即便在后台停止时仍然接收响应,你可以在onCreate()
中绑定,在onDestroy()
中解除绑定。
通常不在 onResume()
和 onPause()
方法中进行绑定和解除绑定,因为这些回调函数在每次生命周期转换的时候都会调用,你应该把这些转换中的操作保持到最小。并且,如果多个activity绑定到同一个service,并且其中的两个activity有一个转换,service可能会被销毁然后又被重建。
参考资料
API Guides:Bound Services
http://developer.android.com/guide/components/bound-services.html
Binding to a Service的更多相关文章
- 【起航计划 037】2015 起航计划 Android APIDemo的魔鬼步伐 36 App->Service->Remote Service Binding AIDL实现不同进程间调用服务接口 kill 进程
本例和下个例子Remote Service Controller 涉及到的文件有RemoteService.java ,IRemoteService.aidl, IRemoteServiceCallb ...
- Service Broker应用(2):不同server间的数据传输,包含集群
不同Server之间的数据传输,包含DB使用AlwaysOn 配置脚本: SQL Server Service Broker 跨集群通信 具体的TSQL 脚本语句如下.注意的是TSQL语句是在发送方还 ...
- 重温WCF之构建一个简单的WCF(一)(2)通过Windows Service寄宿服务和WCF中实现操作重载
参考地址:http://www.cnblogs.com/zhili/p/4039111.html 一.如何在Windows Services中寄宿WCF服务 第一步:创建Windows 服务项目,具体 ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- Web Service平台概述
Web Service平台主要涉及的技术有SOAP(Simple Object Access Protocal,简单对象访问协议), WSDL(Web Service Descriptio ...
- Managing the Lifecycle of a Service
service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的service通过其他组件调用 startService()被创建. 这种 ...
- Service完全解析(转)
今天我们来讲一下Android中Service的相关内容. Service在Android中和Activity是属于同一级别上的组件,我们可以将他们认为是两个好哥们,Activity仪表不凡,迷倒万千 ...
- Android Service的生命周期
service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的service通过其他组件调用 startService()被创建. 这种 ...
- How to: Host and Run a Basic Windows Communication Foundation Service
This is the third of six tasks required to create a Windows Communication Foundation (WCF) applicati ...
随机推荐
- django 数据库获取值
数据库表中的内容如下: models.Step_Type.objects.values()获取model中的符合条件的值, 实际为把表中的所有值都查询出来,如查询结果为:<QuerySet [{ ...
- leetcode第一刷_Jump Game II
要求最小的步数,是不是非常easy想到用dp啊? 我一開始的做法是,当找到了一个可以从它延伸到更远的位置,就把这个位置和最远位置的步数都更新一下,结果超时了. 事实上这样不仅是超时的,并且是错误的.由 ...
- 编译Sqoop2错误解决
Sqoop2的代码结构相对于Sqoop做了大幅度调整,当中编译方式也从ant+maven杂糅的方式变为依赖maven3.今天将源码下下来,放到linux測试机器/export/build下后,执行&q ...
- vue 阅读一【待完结】
初步方案:从第一个commit开始到到最近的commit,从代码的大纲开始到细节,利用思维导图. 注意: 源码阅读是一件比较枯燥的事情,要有别的东西一起做,源码只是偶尔看看,经常发呆的话,非常浪费时间 ...
- Apache Commons Lang的StringUtils.isEmpty(STR)和StringUtils.isBlank(STR)
Apache Commons Lang是常用的基础框架,其中字符串判空在项目中尤为常用,而自己常常忘记他们的区别. package com.nicchagil.test; import org.apa ...
- SQLAlchemy的“缓存”问题导致的BUG
问题描述: 最近做项目,遇到一个问题,两个项目操作同一个数据库,其中A项目用的pymysql链接操作数据库,B项目用的sqlalchemy,当我请求B项目中的一个接口,会通知A项目操作数据库,然后返回 ...
- Spring Boot干货系列:(三)启动原理解析
Spring Boot干货系列:(三)启动原理解析 2017-03-13 嘟嘟MD 嘟爷java超神学堂 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说 ...
- session的创建与销毁
刚才在测试一个HttpSessionListener package org.lxh.listenerdemo ; import javax.servlet.http.* ; public class ...
- 接收与发送邮件(XE10.2+WIN764)
千万不要用QQ邮箱测试,我试了半天,没整明白. 一.设置信息 POP3接收邮件POP3服务器:exchange.grandsoft.com.cn端口:110账号:zhujq-a@glodon.com密 ...
- 一款纯css3实现的机器人看书动画效果
今天要给大家介绍一款纯css3实现的机器人看书动画效果.整个画面完全由css3实现的绘制,没有使用任何图片元素.机器人的眼睛使用了动画元素.我们一起看下效果图: 在线预览 源码下载 实现的代码. ...