美文网首页我爱编程
Service详解(一):理论篇

Service详解(一):理论篇

作者: erki_stwee | 来源:发表于2018-06-21 23:00 被阅读18次
Service生命周期.png

本文重点

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

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

Service的onStartCommand方法的返回值及其区别?

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

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

  • 启动
    多次调用startService():onCreate()方法只会调用一次,onStartCommand()会多次调用;
    多次调用bindService():onCreate()方法只会调用一次,onBind()方法只会执行一次;
  • 解绑
    startService()无论调用多少次,对stopService()方法或者stopSelf方法()的单个调用都会停止该服务;
    unbindService()方法的调用解绑unbindService()方法

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

Service的真正销毁是在调用onDestroy()方法之后,在销毁服务之前需要对已经启动的服务进行解绑(并不需要考虑顺序)

3.Service的onStartCommand方法的返回值及其区别?

 /**
  * 为了兼容版本,在Service被kill后,并不保证onStartCommand
  * 方法会被再一次调用
  */
  public static final int START_STICKY_COMPATIBILITY = 0;
 /**
  * service被kill后,保留启动状态,但不保存intent,之后系统会尝试
  * 重启该service,并重新回调onStartCommand。如果没有其他start命令。Intent为null。
  * 因此需要对onStartCommand方法中的intent值判空
  */
  public static final int START_STICKY = 1;
 /**
  * 常规操作。如果在执行完onStartCommand方法后,服务被异常kill掉,系统不会自动重启该服务。
  */
  public static final int START_NOT_STICKY = 2;
 /**
  * service被kill后,系统会组织一次service重启(除非那之前调用了stopSelf方法),被杀死前
  * 最后一次传递的intent将重新执行,该flag不会传递空intent。
  */
  public static final int START_REDELIVER_INTENT = 3;

这里简单总结一下
START_STICKY:服务明确需要管理并长期运行;不需要记住服务被杀死时的状态;example:播放音乐。
START_NOT_STICKY:服务明确不需要管理;服务定期运行并自行停止;example:闹钟服务或者服务器数据轮询。
START_REDELIVER_INTENT:服务明确需要管理;重新获取服务被杀死前的状态;example:文件下载。

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

Service默认是在主线程中运行。如果Service要做CPU密集型或阻塞操作,它应该在子线程中完成操作(IntentService类有自己的线程,可以完成耗时的操作)。否则会产生ANR.

本文参考自

Android开发者平台

相关文章

网友评论

    本文标题:Service详解(一):理论篇

    本文链接:https://www.haomeiwen.com/subject/sbubeftx.html