一,service的两种启动方式
service 作为一个应用程序组件,则意味着它可以在不同组件间、甚至在 不同应用间进行复用,还意味着可以配置成在另一个独立的进程中运行。
startService单向传递数据
bindService可通过binder实现数据的交互以及监听。
两种方式的生命周期
service未启动,然后调用
startService:onCreate()->onStartCommand()-----service running -----onDestroy()
bindService:onCreate()->onBind()----------service running -------onUnbind()->onDestroy()
service已经通过startService启动之后,再调用
startService:onStartCommand()-----service running -----onDestroy()
bindService:onBind()----------service running -------onUnbind()->onDestroy()
startService:onStartCommand()-----service running -----onDestroy()
bindService:----------service running -------onUnbind()->onDestroy()
注意:这里的onBind()不再调用,因为binder已经存在并缓存起来,绑定service成功后会直接返回binder,并不需要再调用onBind()了。
onCreate()
该方法仅在 service 第一次被创建时会被系统调用,可以用来执行一些一次性的初始化操作。
也就是,无论startservice,bindservice多少次,就永远只有一个service。
onStartCommand()
一个应用组件(例如 Activity)可以通过调用 startService()并传入一个 Intent 来启动指定的 service,Intent 可以带上所需的数据,Service 会在 onStartCommand() 回调中收到该 Intent。
例如,假如一个 Activity 需要上传一些数据,则可以 start 一个service 并透 过 Intent 把需要保存的数据(或数据的路径)传入。service在 onStartCommand() 中 收到 Intent,可以提取出数据并上传。上传完毕,你需要负责在适当的时 候,通过调用 stopService() 或 stopSelf() 来停止 service 的运行。
onStartCommand() 方法返回了一 个整数,该整数描述了当系统杀掉你的 service 时,后续会如何处置你的 service。 该返回值的取值范围如下:
START_NOT_STICKY
如果你的 service 被杀掉了,将不会自动重启(除非系统中还有未处理的 intent 请求等待投递)。
START_STICKY
如果系统杀掉了 service,将会在资源不再紧张时重新启动你的 service, 并调用 onStartCommand() 方法。注意,该方法 不会 重新传入上次的 intent,而是传入一个 null intent(除非系统中有待投递的请求,则会传 入待投递请求的 Intent)。这种情况适合类似媒体播放器的应用, 这类 service 在启动时并非执行某个指令,而是持续运行并等待任务。
START_REDELIVER_INTENT
如果 service 被杀掉了,将会被重启并且会传入上一次的 intent,其他未 处理的 intent 将会依次被投递。该选项适合用来执行一些希望立即被恢复的 任务,例如下载文件
onBind()
要创建一个 bindservice,你必须实现 onBind() 回调方法,并返回一个 IBinder 供 client 使用。其他的应用组件通过调用 bindService() 来绑定你 的 service,并获得 IBinder 接口以便和你的 service 交互。
这类 service 存在的目的就是为了服务于 bind 它的其他组件,所以,一旦没有组件 bind 它 了,则会被系统销毁。就是说如果执行了unbindService(),那么service就有可能会被销毁。
多个 clients 可以同时 bind 一个 service,当所有 clients 通过调用 unbindService() 解除绑定时,系统便会销毁该 service。
当一个 service 被多个 clients 绑定时,onBind() 只 会在第一次绑定时被系统调用一次,用于获取 IBinder 实例,后续的 bind 操作 系统会直接返回相同的 IBinder 实例,而不再调用 onBind()。这点和 onStartCommand() 有很大的区别。
onDestroy()
Call