Android-Service总结

530 阅读2分钟

1. 通过 startService Service 会经历 onCreate 到 onStart,然后处于运行状态,stopService 的时候调用 onDestroy方法。如果是调用者自己直接退出而没有调用 stopService 的话,Service 会一直在后台运行。

2. 通过 bindService Service 会运行 onCreate,然后是调用 onBind, 这个时候调用者和 Service 绑定在一起。调用者退出了,Srevice 就会调用 onUnbind->onDestroyed 方法。 所谓绑定在一起就共存亡了。调用者也可以通过调用 unbindService 方法来停止服务,这时候Srevice 就会调用 onUnbind->onDestroyed 方法。

需要注意的是如果这几个方法交织在一起的话,会出现什么情况呢?

  • 一个原则是 Service 的 onCreate() 的方法只会被调用一次,就是无论调用多少次的 startService() 和bindService(),Service只会被创建一次。

  • 如果先是 bind 了,那么 start 的时候就直接运行 Service 的 onStart 方法,如果先是 start,那么 bind的时候就直接运行 onBind 方法。

  • 如果 service 运行期间调用了 bindService,这时候再调用 stopService 的话,service 是不会调用onDestroy 方法的,service 就 stop 不掉了,只能调用 UnbindService, service 就会被销毁

  • 如果一个 service 通过调用 startService 被 start 之后,多次调用 startService 的话,service 会多次调用 onStart 方法。多次调用 stopService 的话,service 只会调用一次 onDestroyed 方法。

  • 如果一个 service 通过调用 bindService 被 start 之后,多次调用 bindService 的话,service 只会调用一次 onBind 方法。多次调用 unbindService 的话会抛出异常。

在 service 的生命周期方法 onstartConmand()可不可以执行网络操作?如何在 service 中执行网络操作?

可以直接在Service中执行网络操作, 在onStartCommand()方法中可以执行网络操作 (跟SDK版本有关,不建议直接在Service中执行网络请求,容易引起ANR)

参考:

【Android】Service那点事儿

Service 和 IntentService 的区别