首先看下其生命周期的区别:
生命周期: onCreate → startCommand → onDestroy
onCreate → onBind→onUnBind→ onDestroy
静态绑定对应着startService
;动态绑定对应着bindService
,静态有自己独立的生命周期,动态会依附activity
等组件的生命周期。
1、生命周期上的区别
-
执行
startService
时,Service
会经历onCreate->onStartCommand
。当执行stopService
时,直接调用onDestroy
方法。调用者如果没有stopService
,Service
会一直在后台运行,下次调用者再起来仍然可以stopService
。 -
执行
bindService
时,Service
会经历onCreate->onBind
。这个时候调用者和Service
绑定在一起。调用者调用unbindService
方法或者调用者Context
不存在了(如Activity
被finish
了),Service
就会调用onUnbind->onDestroy
。这里所谓的绑定在一起就是说两者共存亡了。
注意:Service
的onCreate
的方法只会被调用一次,
就是你无论多少次的startService
又 bindService
,Service
只被创建一次。
如果先是bind
了,那么start
的时候就直接运行Service
的onStartCommand
方法,
如果先是start
,那么bind
的时候就直接运行onBind
方法。如果你先bind
上了,就stop
不掉了,只能先UnbindService
, 再StopService,
所以是先start
还是先bind
行为是有区别的。
2、调用者如何获取绑定后的Service的方法
onBind
回调方法将返回给客户端一个IBinder
接口实例,IBinder
允许客户端回调服务的方法,比如得到Service
运行的状态或其他操作。我们需要IBinder
对象返回具体的Service
对象才能操作,所以说具体的Service
对象必须首先实现Binder
对象。
3、既使用startService又使用bindService的情况
那么,什么情况下既使用startService,又使用bindService呢?
如果你只是想要启动一个后台服务长期进行某项任务,那么使用startService便可以了。如果你还想要与正在运行的Service取得联系,那么有两种方法:一种是使用broadcast,另一种是使用bindService。前者的缺点是如果交流较为频繁,容易造成性能上的问题,而后者则没有这些问题。因此,这种情况就需要startService和bindService一起使用了。
另外,如果你的服务只是公开一个远程接口,供连接上的客户端(Android的Service是C/S架构)远程调用执行方法,这个时候你可以不让服务一开始就运行,而只是bindService,这样在第一次bindService的时候才会创建服务的实例运行它,这会节约很多系统资源,特别是如果你的服务是远程服务,那么效果会越明显(当然在Servcie创建的是偶会花去一定时间,这点需要注意)。
Thanks
- https://www.cnblogs.com/sesexxoo/p/6189932.html
- https://my.oschina.net/tingzi/blog/376545