【Android】Service的生命周期

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sted_zxz/article/details/77725532

先来看一张图:
这里写图片描述
上图介绍了Service生命周期的两种情况:

使用startService()

如果使用startService()开启服务,且startService()多次,那么只有第一次会回调onCreate()onStartCommand(),后面只会回调onStartCommand()

然后如果使用了stopService(),那么就会回调onDestroy()

使用bindService()

如果使用bindService()绑定服务,且bindService()多次,那么只有第一次回调onCreate()onBind(),后面这两个方法都不会被回调了。

然后如果每个绑定service的对象都执行unbindService(),那只有最后一次onUnbind()会被回调,并且会回调onDestroy()

然而肯定还有其他情况。

startService()和bindService()混合使用

如果先使用startService(),那会回调onCreate()onStartCommand(),再使用startService(),就只会回调onStartCommand();如果再使用bindService(),那么只有第一次回调onBind()
————————————————————
如果先使用bindService(),那么只有第一次回调onCreate()onBind();如果再使用startService(),就只会回调onStartCommand()

然后如果还有绑定service的对象没解绑,那么先使用stopService()没有回调,但是最后一个对象执行完unbindService()之后,先回调onUnbind(),再回调onDestroy()
————————————————————
然后如果绑定service的对象全都执行了unbindService(),那最后一次unbindService()之后回调onUnbind()。然后stopService(),那么就会回调onDestroy()

以上可以参考我的测试demo,代码地址:AndroidStudy项目下的/app/src/main/java/com/example/tsnt/androidbase/service_lifecycle目录。

以上总结
一般情况下Service的生命周期中只有onStartCommand()会被多次回调,onCreate(),onBind(),onUnbind(),onDestory()在一个生命周期中只能被回调一次。

但是也有特殊情况,请往下看。

onRebind()

onRebind()的回调与否和onUnbind()的返回值有关。

如果onUnbind()返回false,那么onRebind()不会被调用。

如果onUnbind()返回trueonRebind()会在如下情况被调用:
第一步,调用 startService,触发 onCreate()与 onStartCommand()。
第二步,调用 bindService(),触发 onBind()。
第三步,调用 unbindService(),触发 unbindService()。
第四步,调用 bindService(),触发 onRebind()。
第五步,调用 unbindService(),触发 onUnbind()。
第六步,调用 stopService(),触发 onDestroy()。

也就是说在service没被销毁的情况下,绑定过服务然后解绑了,并且onUnbind()的返回值为true,再绑定服务的时候会回调onRebind(),再解绑的时候会回调onUnbind()

注意点
1.onStart()会在onStartCommand()中被调用,现在不推荐使用,在API该方法中被标记为@Deprecated

2.onBind()的作用onBind()主要用来产生一个 Binder,只需要知道同一个服务的 Binder 只会有一个,onBind() 只会在第一个“轮回”调用一次,主要负责则 “Create Binder”。在onBind()中需返回一个IBinder实例,不然ServiceConnectiononServiceConnected()方法不会调用。

3.ServiceConnection的回调方法onServiceDisconnected()在连接正常关闭的情况下是不会被调用的,该方法只在Service被破坏了或者被杀死的时候调用,比如系统资源不足的时候。

参考:
1.【Android】Service生命周期回顾
2. 深入理解Android的startservice和bindservice

展开阅读全文

没有更多推荐了,返回首页