【Android】Service的生命周期

xiaoxiao2021-02-27  223

先来看一张图: 上图介绍了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()返回true,onRebind()会在如下情况被调用: 第一步,调用 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实例,不然ServiceConnection的onServiceConnected()方法不会调用。

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

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

转载请注明原文地址: https://www.6miu.com/read-11767.html

最新回复(0)