【问题标题】:Android sticky Service lifecycle, how to know when to call stopSelf()?Android 粘性服务生命周期,如何知道何时调用 stopSelf()?
【发布时间】:2025-12-21 04:35:15
【问题描述】:

我正在播放媒体,所以我有一个返回 START_STICKY 的绑定前台服务。简单的问题:我如何判断何时停止自我()?我有一些想法,但它们似乎都被各种陷阱所破坏......

  1. 尝试检测我的应用何时不再运行。通常的技术似乎是通过 ActvityManager.getRunningTasks() 但现在已弃用。此外,我们知道 Activity onDestroyed() 可能不会被调用,因此也不能依赖它。

  2. 稍等片刻:如果音频没有播放,例如 10 分钟,则终止服务。但这有一个问题,即应用程序可能仍在运行,而我的服务会执行一些其他操作,例如更新 UI 以显示“即将启动”,即使音频没有播放也是如此。

这给我留下了一种丑陋的选择 3:永远不要调用 stopSelf() 并且如果没有绑定就不要更新 UI。但是使用 stopForeground() 来帮助系统决定终止服务。

我错过了什么?

【问题讨论】:

    标签: android android-service android-lifecycle


    【解决方案1】:

    如果您的应用在其 'onStart()' 方法中使用 'bindService()' 并在其 'onStop()' 方法中使用 'unbindService()' 您的服务类可以覆盖 'onUnbind()' 以便服务可以采取行动该应用程序已停止的通知。

    另请参阅 Service.onUnbind()

    如果活动正在运行但用户已停止重播,那么您可能需要释放媒体播放器(这并不一定意味着停止服务)。

    AFAIK 如果某些 UI 元素(例如 TextView)已经具有“即将出现”信息,它不会仅仅因为服务释放媒体播放器或调用“stopSelf()”而丢失它。当重播停止时,接下来不会有新歌出现。

    也许您想在活动进入“onPause()”后立即将此类信息写入 SharedPreferences 或 SQLite 数据库,并在“onCreate()”中检索它。

    【讨论】:

    • 应用程序没有 onStart 或 onStop,这些是 Activity 方法,由于 Activity 生命周期的性质,无法帮助您确定您的应用程序是否正在运行。正如我在问题中所说,即使没有播放音频(它是一个流式对讲广播应用程序),“接下来”也会改变。我认为我的选项 3 实际上可能是“正确”的方法,因为 Android 确实没有“应用程序运行”的概念。