服务service生命周期及方法使用
本文主要从四大组件service的开关绑定的4个方法开始,自己总结出的一些细节特点,供大家参考!如有纰漏和错误请大家指出!如需转载请标明出处,谢谢!—下一篇为《Service交互特征》,同时会上传Demo,敬请期待!
startService():开启服务-让服务在后台默默工作
- 可以重复运行,重复只会运行onStartCommand
- 返回ComponentName(标识唯一的应用程序组件)对象主要成员为包名+完整class类名(可以通过类名查询服务是否运行)
- 未绑定运行:构造-onCreate-onStartCommand
- 已绑定运行:onStartCommand
- service已经运行:onStartCommand
- service运行后即使退出应用,也不会自动停止
- 服务与应用无法进行数据交互,方法调用等
stopService():停止服务
- 可重复运行,运行返回boolean-重复运行返回false或标记为停止
- service已经运行未绑定:onDestroy-销毁内存实例
- service已经运行已绑定:无效并返回true-标识为停止
- stopSelf();服务自身调用,与stopService功能一致
标记为停止:服务并未停止或销毁,如果一个已启动并标记为停止的服务在完全解绑时彻底销毁
bindService():绑定服务-与服务交互
- 可以重复运行,但重复运行-每运行成功一次必然回调一次onServiceConnected,onBind()只运行一次
- 服务未开启时:构造-onCreate-onBind-回调onServiceConnected
- 服务已开启且未绑定时:onBind()-回调
- 服务已开启且已绑定过:只执行回调
- 未解绑退出绑定的activity会有报错Log ServiceConnectionLeaked
- onServiceDisconnected()只有要非正常结束服务时调用
- 支持多绑定,服务与应用可以进行数据交互,方法调用等
unbindService()
- 同一绑定对象不能重复使用,否则报错
- 未绑定运行会抛出异常“Service not registered”,使用时判断是否绑定
- 未开启(未使用startService)已绑定且无多绑定:onUnBind-onDestroy-销毁内存实例
- 未开启已绑定且有其它绑定:只解绑(多绑定时只在服务中标记此绑定解除,此时不运行onUnBind)
- 已开启且完全解绑(多绑定时,没有任何其它绑定):onUnBind,在一次开启和关闭服务过程中只运行一次。
- 已开启且完全解绑且已标识停止:onUnBind-onDestroy-销毁内存实例
- 判断服务是否绑定采用在ServiceConnection添加一个boolean成员变量的方式,在onServiceConnected赋值为true;onServiceDisconnected赋值为false;并在unbindService使用时同时调用setBind(false)
- 未解绑activity退出时:日志报错(运行时异常)并自动运行unbindService
使用注意点
- 应用与服务交互时使用bindService
- 使用了startService应用退出服务不会停止
- 绑定后activity退出时自动运行unbindService
- 解绑时建议先判断绑定状态
- 服务运行在主线程,耗时任务开子程线运行
- 在未完全(多绑定)解绑时,stopService和stopSelf起标识停止的作用
- 以上方法均支持跨进程
- 跨进程问题后续详解