【问题标题】:Start JobService in foreground on Android在 Android 的前台启动 JobService
【发布时间】:2017-10-18 09:37:28
【问题描述】:

我使用com.firebase.jobdispatcher.JobService 来同步数据,我通过使用FirebaseJobDispatcher 调度Job 来启动它。

问题:我不喜欢它在我第一次启动应用程序时运行之前的延迟。

有没有一种方法可以在我第一次使用它时在 Android O 上将服务作为前台服务(带有通知)启动? (而不是将其安排为作业)

我试过了:

ContextCompat.startForegroundService(context, intent);

但这不会调用JobService的onCreate。

【问题讨论】:

    标签: android android-service android-jobscheduler jobservice


    【解决方案1】:

    结论:使用两种服务。

    无法在前台启动com.firebase.jobdispatcher.JobService

    普通的Service 无法按计划启动Job

    我创建了两个服务类,它们都启动相同的同步流:已修复。

    【讨论】:

      【解决方案2】:

      我建议您使用 Oreo 中引入的新 JobIntentService,而不是 FirebaseJobDispatcher。然后你可以从你的应用程序的前台启动一个后台服务(在后台创建的后台服务现在是不允许的,在你必须显示通知之前你只有 5 秒的时间来做事)。使用 JobIntentService,您就没有这些限制。

      如果您不想,也不必显示同步通知。但是如果你真的需要这样做,可以在 JobIntentService 的 onHandleWork() 方法中进行。

      这篇文章很好地解释了奥利奥中新的后台执行限制:

      https://medium.com/til-kotlin/jobintentservice-for-background-processing-on-android-o-39535460e060

      JobIntentService 非常易于使用,可以解决您在新背景限制下可能遇到的任何问题。将 Pre-Oreo 中使用的普通 IntentService 转换为 JobIntentService 也很容易。因为它在支持库中,所以它被向后移植到以前的版本。在 Oreo 及更高版本中,它让操作系统决定何时安排作业(您不必直接使用 JobDispatcher),并且 pre-Oreo 将启动一个正常的 IntentService。服务通过调用静态帮助程序 enqueueWork() 方法启动和处理工作。

      更多详情请看这里:

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

      【讨论】:

      • 哦忘了说:JobIntentService 会自动为你处理唤醒锁。
      • 感谢详尽的回答。我阅读了那些文章,但是您在哪里看到在 Android O 上 JobIntentService 可以作为普通服务启动,而不是计划并在 X 秒后启动?这就是我的问题所在。我不想安排任务。
      • 啊,好吧,那我不确定。出于我们的意图和目的,在操作系统决定启动服务时启动服务是可以的。对于您的用例,我认为您必须显示“同步”通知,因为这可能是一个漫长的过程。
      • 是的,这就是我想要的,但不是在所有情况下。我想要一项既可调度又可前台服务的服务。似乎不可能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 2020-08-31
      • 2017-09-01
      相关资源
      最近更新 更多