startService, bindService区别和总结

service有2种启动方式,startService和bindService。知识点包括以下几个方面(这里只说一些网上没有的):

一. 生命周期
(一) startService生命周期
1. onCreate() –> onStartCommand –> onDestroy()。
2. startService 在多个context里多次调用,只有第一次会调用service的onCreate(),所有的context调用startService都会重复调用service的onStartCommand(Intent intent, int flags, int startId),并且每次startId数字逐次递增,并且的调用的service是同一个对象实例(即第一次创建的那个)。
3. 一旦利用startService启动service,那么不管调用者context的生命周期是否结束(例如finish),service依然在后台运行,直至调用stopService,这是会回调service的onDestroy(),service的生命周期结束。
4. stopService(intent)可以多次调用且不报错,但是只有第一次能够起作用,调用到service的onDestroy()。

(二) bindService生命周期
1. onCreate() –> onBind() [ Activity–> onServiceConnected]–> onUnbind()。bindService方法在onCreate之前会调用service的构造函数,但是startService方法不会。
2. bindService在多个context里多次调用,只有第一次调用会调用service里的onCreate()和onBind()。后续的都不会触发这2个方法。
3. 利用bindService启动service之后,调用者如果生命周期结束(比如finish),那么会自动调用service的onDestroy(),但是service必须要所有bind/start过它的全部unbind/stop了才会结束生命周期。要注意service生命周期结束之前一定要记得调用unbindService(conn),否则会出现 leaked ServiceConnection错误。
4. unbindService(conn)只能调用一次,否则程序会崩溃。
5. onServiceDisconnected只会在service意外退出时调用,记得在这里回收一些资源。

二. 控制service
另外,我认为利用startService完全可以在任何Activity里来控制被启动过的service来做不同的事情,而不是网上说的完全失去了控制,因为我们完全可以利用intent带过去不同的值,在service里的onStartCommand里来判断intent里带来的值,从而达到控制的效果,经过测试时完全可以的,因为不同的activity之间利用startService启动的service是同一个对象实例。

三. 使用场景
一般说来,bindService使用的场景比较多。另外,混合使用的场景下,只有当所有的调用者释放掉一个service的bind引用(即unbindService),这个时候再用stopService(或者先stopService再释放所有的bind引用),这个service才会结束生命周期。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章