近期在研究四大组件之一Service的底层代码原理,发现在bindService时其flag设置为BIND_ABOVE_CLIENT与否对Service整个生命周期有着不同的影响,故自己写了一个小的demo,对应其不同的生命周期调用输出不同的Log,并进行不同的输入序列验证对生命周期的理解,感觉还挺好玩的,虽然在实际业务中同一个client可能不会这样同时进行start或bind,但业务比较复杂,且service连接不同的client时,还是有可能发生这些“奇怪”的组合的,下面对我整理的操作顺序和对应的生命周期调用总结如下,建议只看第一列,心中有了答案之后再看后面的答案,如果实在不信可以下载下面的代码自己动手验证哦~
一起来看看你是否真正理解了Service生命周期吧~
验证表
操作顺序 | 无BIND_ABOVE_CLIENT标志位 | 有BIND_ABOVE_CLIENT标志位 |
---|---|---|
START-STOP | (create - start) - destroy | (create - start) - destroy |
START-BIND-STOP | (create - start) - bind - (unbind - destroy) | (create - start) - bind - × |
START-BIND-UNBIND-STOP | (create - start) - bind - unbind - destroy | (create - start) - bind - unbind - destroy |
START-BIND-STOP-UNBIND | (create - start) -bind - (unbind - destroy) - ERROR | (create - start) - bind - × - (unbind - destroy) |
BIND-START-UNBIND-STOP | × - (create - bind - start)- unbind - destroy | (create - bind) - start - unbind - destroy |
BIND-UNBIND | ×- × | (create - bind) - (unbind - destroy) |
BIND-STOP | × - × | (create - bind) - × |
BIND-START-STOP | × - (create - bind - start) - (unbind - destroy) | (create - bind)-start - × |
BIND-START-STOP-UNBIND | × - (create - bind- start) - (unbind - destroy) - × | (create - bind)- start - × - (unbind - destroy) |
Tips:
- stopService() 方法
- 对BIND_AUTO_CREATED,不做任何事情,只做标记(做stopped标记)
- 对非BIND_AUTO_CREATED,将所有的connection全部unbind,然后destroy
- bindService() 方法
- 对BIND_AUTO_CREATED,在bind的同时,先create
- 对非BIND_AUTO_CREATED,不做任何事情,只标记(做waiting标记,并存到waitingMap中,等到该service被create后,再遍历该waitingMap,并bind)