Android Service的绑定 续篇:关于绑定的补充说明

  

 

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绑定,你必须:

1.实现ServiceConnection

  其中需要实现两个回调方法:

  onServiceConnected()

  系统调用这个方法来传递service的onBind()方法返回的 IBinder 。

  onServiceDisconnected()

  当和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

posted @   圣骑士wind  阅读(2968)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示