清晰的理解service

1、Service的start和bind状态有什么区别?

  • 通过startservice启动的service拥有独立的生命周期;调用startservice方法会依次调用onCreate –> onStartCommand方法,多次调用startservice方法会重复调用onStartCommand方法,onCreate 方法只会调用一次;通过startservice启动的service,必须通过stopService或stopself来停止service;(intentservice【异步服务】会自动调用stopself)

  • 多次调用bind方法,只会调用一次onbind方法,bind方式启动的service依赖这些组件,该组件销毁后,service有随着销毁

2、同一个Service,先startService,然后再bindService,如何把它停止掉?

  • 不管 startservice 方法调用多少次,只需要stopservice方法调用一次,即可停止service
  • 多次调用bindservice来bind同一个组件,只需要调用一次unbindservice方法,如果是不同的组件,则需要多次onbind
  • 因此,这种情况需要调用一次stopservice方法和unbindservice方法,执行顺序没有要求,最后执行的stopservice或unbindservice方法会导致service的onDestroy执行

3、你有注意到Service的onStartCommand方法的返回值吗?不同返回值有什么区别?

返回值有四种:

  • START_NOT_STICKY
    如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务。

  • START_STICKY

如果系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,系统会用一个null的Intent对象来调用onStartCommand()方法,在这个情况下,除非有一些被发送的Intent对象在等待启动服务。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。

  • START_REDELIVER_INTENT

如果系统在onStartCommand()方法返回后,系统就会重新创建了这个服务,并且用发送给这个服务的最后的Intent对象调用了onStartCommand()方法。任意等待中的Intent对象会依次被发送。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件。

  • START_STICKY_COMPATIBILITY

START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

4、Service的生命周期方法onCreate、onStart、onBind等运行在哪个线程?

service的生命周期方法都运行在主线程,所以不能在直接service中做耗时操作,service是后台服务跟thread是有区别的,在service中的做耗时操作需要在service中创建子线程去执行。service的ANR时间是20s

5.service和thread的区别

service是运行在主线程的,做耗时操作会引发ANR;service是指Android的后台,它的运行时完全不宜懒UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑。

既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。

参考郭霖大神博客和星球伙伴

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章