【问题标题】:Precise Semantics of START_STICKY flag for Android ServiceAndroid 服务的 START_STICKY 标志的精确语义
【发布时间】:2014-09-28 00:51:10
【问题描述】:

不知何故,我很难解析 START_STICKY 标志的 official description

从 onStartCommand(Intent, int, int) 返回的常量:如果这个 服务的进程在启动时被杀死(从 onStartCommand(Intent, int, int)),然后让它处于启动状态 但不要保留这个传递的意图。稍后系统将尝试 重新创建服务。因为它处于启动状态,所以它会 保证在创建后调用 onStartCommand(Intent, int, int) 新的服务实例;如果没有任何待处理的启动命令 交付给服务,它将以空意图调用 对象,因此您必须小心检查。

此模式适用于将显式启动的事物,并且 停止运行任意时间段,例如服务 执行背景音乐播放。

具体来说,以下四个部分没有技术意义(又名让我去 WTF):

  • “如果这个服务的进程被杀死了......,那么让它保持在启动状态” [你如何让被杀死的东西保持在启动状态?]
  • “稍后系统会尝试重新创建服务。因为它处于启动状态,...” [如果系统尝试重新创建服务,为什么它处于启动状态服务?]
  • "因为处于启动状态,所以保证调用onStartCommand(...) ..." ["保证调用"?抱歉,无法从语言上解析该短语]
  • “此模式适用于将明确启动和停止运行任意时间段的事物,...” [“并停止运行”??]

有没有人对这个标志有更好的规格?而且,对于任何阅读此内容的 Google 员工:wtf?你能在内部迅速修复它吗?

【问题讨论】:

    标签: android android-service


    【解决方案1】:

    如您所知,Android 中的服务可以有两种形式:

    理解描述的关键是Started service必须管理自己的生命周期,即只有可以停止服务的组件是服务本身通过调用 stopService() 调用 stopSelf() 或其他组件。一旦 Started service 已启动(onStartCommand() 返回)它处于启动状态并且不会停止,除非 stopSelf()stopService() 被调用。因此,如果系统过早地终止服务(stopSelf()stopService() 均未调用),则该服务仍被视为处于启动状态。您可以通过在 onStartCommand() 中返回一个标志来告诉(信号给)系统如何在终止服务后继续执行该服务。

    可能Extending the Service class末尾给出的START_STICKY标志的描述对你来说会更清楚。

    附:关于 "and stop to run??" 的困惑,请尝试将其理解为 "...明确地启动和停止以运行..."

    编辑:

    也可以看看this question

    【讨论】:

      【解决方案2】:

      START_STICKY and START_NOT_STICKY

      START_STICKY 告诉操作系统在它有足够的内存后重新创建服务,并以空意图再次调用 onStartCommand()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 2022-12-09
        相关资源
        最近更新 更多