Android里Service的bindService()和startService()混合使用深入分析

原创 2016年05月30日 13:03:36

先讲讲怎么使用bindService()绑定服务

应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder绑定是异步的.bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给bindService().ServiceConnection包含一个回调方法,系统调用这个方法来传递要返回的IBinder.

注:只有activities,services,和contentproviders可以绑定到一个service—你不能从一个broadcastreceiver绑定到service.

broadcastreceiver的context生命周期很短暂,bindservice没有什么意义。

bindService步骤

1实现ServiceConnection.
你的实现必须重写两个回调方法:
onServiceConnected()
系统调用这个来传送在service的onBind()中返回的IBinder.
OnServiceDisconnected()
Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.
2调用bindService(),传给它ServiceConnection的实现.
3当系统调用你的onServiceConnected()方法时,你就可以使用接口定义的方法们开始调用service了.
4要与service断开连接,调用unbindService().
当你的客户端被销毁,它将从service解除绑定,但是你必须总是在你完成与service的交互时或当你的activity暂停于是service在不被使用时可以关闭此两种情况下解除绑定.(下面会讨论更多在适当的时候绑定和解除绑定的问题.
使用这个ServiceConnection,客户端可以绑定到一个service,通过把它传给bindService().例如:
Intentintent = new Intent(this, LocalService.class);
bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
第一个bindService()的参数是一个明确指定了要绑定的service的Intent.
第二个参数是ServiceConnection对象.
第三个参数是一个标志,它表明绑定中的操作.它一般应是BIND_AUTO_CREATE,这样就会在service不存在时创建一个.其它可选的值是BIND_DEBUG_UNBIND和BIND_NOT_FOREGROUND,不想指定时设为0即可.。

补充事项

下面是一些关于绑定到service的重要事项:

你总是需要捕获DeadObjectException异常.它会在连接被打断时抛出.这是被远程方法抛出的唯一异常.
对象引用计数是跨进程的作用的.
你应该在客户端的生命期内使绑定和解除绑定配对进行,例如:
如果你需要在你的activity可见时与service交互,你应该在onStart()绑定并在onStop()中解除绑定.
如果你想让你的activity即使在它停止时也能接收回应,那么你可以在onCreate()中绑定并在onDestroy()中解除绑定.注意这意味着你的activity需要使用在自己整个运行期间使用service(即使位于后台),所以如果service在另一个进程中,那么你增加了这个进程的负担而使它变得更容易被系统杀掉.
注:你一般不应该在你的activity的onResume()和onPause()中绑定和解除绑定到service,因为这些回调方法,出现在每个生命期变化中,并且你需要使发生在这些变化中的处理最小化.还有,如果你应用中的多个activity绑定到同一个service,并且有一个变化发生在其中两个activity之间,service可能在当前activity解除绑定(pause中)和下一个绑定前(rusume中)被销毁又重建.

管理(多个客户端)BoundService的生命期

当一个service的所有客户端都解除绑定,Android系统就销毁它(除非它是从onStartCommand()启动).如果你的service是一个纯boundservice,你不需管理它的生命周期—Android系统会为你管理它.。

然而,如果你选择了实现onStartCommand()回调方法,那么你必须明确地停止service,因为service现在被认为是"开始的".在此情况下,service会一直运行,直到service使用stopSelf()停止它自己或另外的组件调用了stopService()停止了它,不管是否有客户端绑定了它.另外,如果你的service已经启动并且接受绑定,那么当系统调用你的onUnbind()方法,你可以选择返回true表示你想在客户端下一次绑定到service时接受一个对onRebind()的调用(而不是一个对onBind()的调用).onRebind()返回void,但是客户端依然会在它的onServiceConnected()回调中接收到IBinder.下图演示了这种生命其的逻辑:



bindService和startService混合使用时

1.如果先bindService,再startService:
在bind的Activity退出的时候,Service会执行unBind方法而不执行onDestory方法,因为有startService方法调用过,所以Activity与Service解除绑定后会有一个与调用者没有关连的Service存在
2.如果先bindService,再startService,再调用Context.stopService

Service的onDestory方法不会立刻执行,因为有一个与Service绑定的Activity,但是在Activity退出的时候,会执行onDestory,如果要立刻执行stopService,就得先解除绑定。

把上面的"如果先bindService,再startService"换成"如果先startService,再bindService",结果是一样的

当一个服务没被onDestory()销毁之前,只有第一个启动它的客户端能调用它的onBind()和onUnbind()。



欢迎扫描二维码,关注公众账号


版权声明:本文为robert原创文章,未经博主允许不得转载。博客地址http://blog.csdn.net/robertcpp

Android混合方式开启服务

bind方式开启服务,可以调用服务的方法,但activity退出服务也随着退出,用 start 方式开启服务,可以保证activity关闭后,服务依然进行。很多需求都是两者的综合,比如音乐播放器,关闭...
  • qq_33665647
  • qq_33665647
  • 2017年02月18日 15:42
  • 772

Android Service 同时使用bindservice和startservice启动的问题

Android Service 同时使用bindservice和startservice启动的问题今天,突然在一个技术群里,有个人说了他在面试中遇到的变态问题,其中就有一个是关于serviceq启动的...
  • wuyouagd
  • wuyouagd
  • 2016年11月28日 15:38
  • 805

【Android一般进阶】startService和bindService混合使用分析

startService、bindService相信很多人都用过,但一般都只是用其中一种,很少有人会混起来使用。 最近在开发项目时,遇到这样的需求:在activity中要得到service对象进而能调...
  • ben0612
  • ben0612
  • 2015年04月22日 10:52
  • 2400

startService与bindService混合使用对Service生命周期的影响

项目开发中有遇到startService与bindService混合使用的情况,发现其对Service生命周期有很大影响,故与各位分享一下。。。   一、正常情况(应该大家都很熟了,简单介绍): (1...
  • codezjx
  • codezjx
  • 2015年04月27日 20:08
  • 4334

Service之startService,bindService交叉使用时的生命周期

1.仅startService和stopService配合使用,与仅bindService,unbindService配合使用时,service生命周期是比较明确的 2.当startService,s...
  • jjj000123
  • jjj000123
  • 2015年12月02日 21:20
  • 357

startService和bindService混合使用分析

转载自:http://m.blog.csdn.net/blog/ben0612/45192145# startService、bindService相信很多人都用过,但一般都只是用其中一种,很少...
  • u014520745
  • u014520745
  • 2015年11月05日 23:20
  • 671

startService与bindService的区别

Android执行Service有两种方法,一种是startService,一种是bindService。下面让我们一起来聊一聊这两种执行Service方法的区别。 1、生命周期上的区别执行star...
  • dfskhgalshgkajghljgh
  • dfskhgalshgkajghljgh
  • 2016年05月21日 16:46
  • 9406

Android中 startService()和bindService()的区别

关于Service的知识,详见郭霖大牛的 Android Service完全解析,关于服务你所需知道的一切(上) 1. startService和bindService关系?服务不能自己运行。一旦...
  • a343902152
  • a343902152
  • 2016年03月11日 16:47
  • 960

android service startService与bindService的区别

Android执行Service有两种方法,一种是startService,一种是bindService。下面让我们一起来聊一聊这两种执行Service方法的区别。 1、生命周期上的区别...
  • zhuangyalei
  • zhuangyalei
  • 2015年07月27日 12:30
  • 2768

深入理解Android的startservice和bindservice

一、首先,让我们确认下什么是service? service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互、它必须由用户或者其他程序显式的启动、它的优先级比较高,它比...
  • wave_1102
  • wave_1102
  • 2014年12月27日 00:08
  • 992
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android里Service的bindService()和startService()混合使用深入分析
举报原因:
原因补充:

(最多只允许输入30个字)