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 ...
随机推荐
- ThinkPHP CURD方法中field方法详解
导读:ThinkPHP CURD方法的field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询在查询操作中field方法是使用最频繁的.$M ...
- INTEL
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html http ...
- 编译是报error: 'EVNET_COME_TO_FOREGROUND' was not declared in this scope
Compile++ thumb : game_shared <= main.cpp jni/hellocpp/main.cpp: In function 'void Java_org_coco ...
- c++重载后置++和--
c++语言并不要求递增和递减运算符必须是类的成员,但是因为它们改变的正好是所操作对象的状态,所以建议将其设定为成员函数.(但下面的代码为了练习,还是分别采用成员函数和全局函数的方式实现) 业余实现代码 ...
- VBA代码分行
如果是语句可以直接在要换行的位加一个空格一个下划: Dim MyPath As String, MyName As String, _ tmpPath As String 如果是字符串可以加以加一个空 ...
- C++基础学习-20120518
1---------printf中的%f会自动转化成double 2---------static_cast的应用实际上static_cast真正用处并不在指针和引用上,而在基础类型和对象的转换上 s ...
- Matlab如何令三维抽象数据可视化的显示出来
Mathworks File Exchange频道近期更新了一个小函数.能够将三维数据矩阵相应的函数u=f(x,y,z)可视化的显示出来. 对我们这些常和数据分析问题打交道的人爱说.还是有点參考价值的 ...
- PDNN中数据格式和数据装载选项
吃人家嘴短,拿人家手短,用别人的东西就不要BB了,按规矩来吧. 训练和验证的数据都在命令行以变量的形式按如下方式指定: --train-data "train.pfile,context=5 ...
- eclipse中maven打包
第一种方式:将依赖包打包进一个jar包中. <build> <plugins> <plugin> <artifactId>maven-compiler- ...
- 文件服务器和web应用分离的思路(转)
目前在做一个应用,有不同的客户端,包括web应用的客户端,其他的客户端,都要访问我的文件服务器,通过文件服务程序提供的服务来访问文件,但是对文件管理服务器这个应用,没有什么思路,请大家给点思路,谢谢: ...