【问题标题】:Avoid Android service getting killed?避免Android服务被杀死?
【发布时间】:2012-11-07 11:55:12
【问题描述】:

我有一个实现远程后台服务的应用程序。此服务用于在线程中下载文件(我会说此服务用作下载管理器)。

当我想下载文件时,我将 url 发送到服务,服务启动一个线程(我使用的是 AsyncTask,但它只在 Android 4.1 中工作),它实际下载文件。但迟早下载会停止,我能够知道这一点,因为我显示的通知不再更新。当我单击通知取消下载时,会向服务发送一个挂起的意图,告诉它取消下载,但在重新创建服务时不会取消下载(调用 onCreate)。

编辑:忘了说我在 onStartCommand() 中返回 START_STICKY

我有什么解决方案?有什么方法可以避免服务被杀死?

我也在研究 startForeground(),如果服务目标是只下载一个文件但我希望支持同时下载多个文件,那就没问题了。

谢谢。

【问题讨论】:

    标签: android android-service


    【解决方案1】:

    关于防止服务被终止的唯一方法是使用startForeground()。即使这样也不能保证 Android 不会杀死你的服务,但没有比这更好的了。我们在使用前台服务方面取得了巨大成功。

    【讨论】:

    • 谢谢。我最终将我的服务限制为一次只能下载一次,并使用了 startForeground()。像魅力一样工作!
    • 我不明白为什么不能使用前台服务进行多个并行下载?您可以在单独的线程中下载每个文件。没有理由不能这样做。
    • 当然可以,但我需要一种方法来调用 startForeground() 而不传递通知。
    【解决方案2】:

    在我见过的系统中避免这种情况的唯一方法是将服务设为系统服务,但为此您需要拥有 AOSP 的权限并扩展 SystemService 类。

    这样的 SystemService 需要编译和创建为 services.jar 的一部分,它是 android 的所有系统服务的组合。不幸的是,考虑到外部服务可能会给系统带来问题,这增加了系统服务稳定性的风险。

    当然,这对于应用程序开发人员来说不是一件容易的事情,但这种方法更适合于致力于完整 AOSP 的 OEM/SoC 供应商。

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      相关资源
      最近更新 更多