【问题标题】:How to repeat run service every 2-5 minutes in Android 9 (Pie)如何在 Android 9 (Pie) 中每 2-5 分钟重复一次运行服务
【发布时间】:2018-12-27 22:11:06
【问题描述】:

我正在开发跟踪用户上班和回家方式的应用程序。应用程序基于小部件(向用户打印信息的位置)和后台服务,用于检查本地化和计算信息并显示在小部件上。

在 Android 9 之前,我使用 AlarmManager 和后台服务每隔几分钟检查一次用户本地化并在小部件上打印信息。 在 Android 9 中存在服务限制,我不能重复服务不少于 15 分钟。 15 分钟太多了,一些用户在上班或回家路上可以有 5 分钟。

我尝试了 JobService、JobIntentService、AlarmManager,但没有人工作不到 15 分钟。只有前台服务在工作,但我无法使用它,因为用户没有运行活动,一切都在后台使用小部件工作。

有没有人知道可以在不到 15 分钟的时间内在后台重复运行服务。或者也许有任何其他想法如何满足我的要求? 我需要每隔几分钟(1-5 分钟)检查一次用户本地化和计数,然后将数据发送到小部件视图。

【问题讨论】:

  • 尝试只运行一项带有计时器的服务,每五分钟重复一次
  • Only Foreground Service is working but I cannot use it because user are not running activity, all is working in background using widget. 你确定吗?您不必使用Activity 来启动前台服务。如果它不起作用,你能用代码更新你的问题吗?
  • 嗨@Sagar,据我所知,要运行前台服务,需要打开活动或关闭前台服务。我对其进行了测试,前台服务在活动打开时启动,并且可以正常工作,但是当我关闭活动时,前台服务并不是每隔几分钟就运行一次。
  • @MikeB 前台服务不需要打开活动。它可以比活动生命周期更长。
  • @Sagar 当应用程序从最近的应用程序中删除时,即使我们使用 START_STICKY,前台服务也会从后台删除。你有什么想法可以防止这种情况发生吗?

标签: android localization widget android-9.0-pie


【解决方案1】:

您可以为此使用前台服务。您只需要像这样将服务作为前台服务启动:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
} else {
    context.startService(intent);
}

服务启动后,您需要立即致电startForeground(int id, Notification notification)

话虽如此,很高兴在https://issuetracker.google.com/issues/76112072 了解该问题。

还可以查看https://android-developers.googleblog.com/2018/12/effective-foreground-services-on-android_11 的博客文章。

他们似乎也通过跟踪触及了您的用例:

被动位置跟踪对于前台服务来说是一个糟糕的用例。 如果用户已同意被跟踪,请使用 FusedLocationProvider API 在以下位置接收捆绑的位置更新 更长的间隔

当屏幕关闭时,您可能不需要拥有最新的小部件。

【讨论】:

  • 谢谢罗伊·索尔伯格
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多