【问题标题】:IntentService + startForeground vs JobIntentServiceIntentService + startForeground vs JobIntentService
【发布时间】:2019-04-14 08:51:41
【问题描述】:

由于 Android Oreo 后台执行限制,文档建议将 IntentServices 重构为 JobIntentService

https://developer.android.com/about/versions/oreo/background

JobIntentService 在 Oreo 下方立即作为 IntentService 运行,但在 Oreo+ 上安排作业

https://developer.android.com/reference/android/support/v4/app/JobIntentService

在什么情况下,将普通的IntentService 作为前台运行Service 并具有持久通知是有意义的,什么时候JobIntentService 更好?

我在JobIntentService 中看到的一个缺点是它不会立即启动。

【问题讨论】:

  • 在中国手机上没有后台任务

标签: android android-service intentservice android-intentservice android-jobscheduler


【解决方案1】:

前台服务不受 Doze 影响,但如果您需要在屏幕关闭时继续执行任务,您仍然必须使用唤醒锁。

JobIntentService(使用 JobScheduler)为您管理唤醒锁,但您对何时启动作业的控制较少。

我会将前台 IntentService(或服务)用于应立即运行且不应被系统暂停/终止的高优先级任务(例如下载数据库)。

我会将 JobIntentService 与 AlarmManager 结合使用来安排低优先级任务,例如定期刷新小部件的数据。

【讨论】:

  • 谢谢。我只是想弄清楚在什么情况下工作会被推迟。文档说,如果设备处于打瞌睡状态,作业不会被执行,但是当设备处于打瞌睡状态时,我什至怎么打电话给enqueue
  • 我正在使用 jobintentservice 我看到的是当应用程序打开或在最近列表中服务正在运行但当应用程序从列表服务停止中删除时你能帮我吗
【解决方案2】:

如果您想进行音乐播放器等长时间运行的操作,请使用带有通知的前台服务。因为 JobIntentService 像 JobScheduler 一样有时间执行限制。 (10分钟)

如果您认为用户不需要了解您的工作,您可以使用 JobIntentService 而无需通知。

如果用户积极使用您的应用,您无需担心打盹模式。

根据https://www.bignerdranch.com/blog/diving-into-doze-mode-for-developers/,有一些打盹模式的情况

Light-Doze 在屏幕关闭后不久开始启动 设备未充电,仅等待几分钟 应用限制只是为了确保用户已停止使用 他们的手机

例如,用户在您进行计算时关闭了屏幕。您的任务已完成,您想要运行后台服务。在这种情况下,您的 JobIntentService 可以延迟,因为设备可以处于打盹模式。

但是,如果您想立即执行后台操作,请使用带 WakeLock 的 ForegrounService,因为 ForegroundService 在屏幕关闭时不起作用。

【讨论】:

  • 如果我想立即执行操作,甚至在需要时使用前台服务,一个又一个操作,在队列中怎么办? IntentService 已弃用。如果我已经有前台服务时使用 JobIntentService 怎么办?没有其他解决办法吗?
猜你喜欢
  • 1970-01-01
  • 2019-04-14
  • 2018-07-26
  • 2020-09-20
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多