美文网首页我爱编程
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