【问题标题】:Starting an Android service with AlarmManager and Broadcast Receiver使用 AlarmManager 和 Broadcast Receiver 启动 Android 服务
【发布时间】:2013-11-07 17:43:32
【问题描述】:

我有一个后台 Android 服务。它在后台运行,检查 URL 以获取某些结果。如果结果发生变化,应用程序会向用户发送通知。我希望这项服务每 3 小时运行一次。我的问题是何时以及如何启动服务?

  • 一般行为是创建广播接收器。
  • 然后在接收者收到ACTION_BOOT_COMPLETED 时启动服务。
  • 此外,当接收器完成启动时,接收器将使用 AlarmManager 并创建一个警报,每 3 小时运行一次。

但是安装应用程序后,如果用户没有重启他/她的手机怎么办?如果用户没有启动,AlarmManager 不会创建警报。

  • 所以另一个选项是在用户首次运行应用程序时创建警报。
  • 如果用户重新启动应用程序怎么办?我应该用AlarmManager.cancel 取消所有以前的警报并重新创建警报吗?

那么,您在哪些条件下为您的 Android 应用程序设置警报?

【问题讨论】:

  • AFAIK,为给定的 PendingIntent(基于给定的 Intent)设置警报会取消之前针对同一 Intent 的警报。试一试。

标签: android service alarmmanager


【解决方案1】:

您有两种方法来创建初始警报,或者在第一次启动应用程序时,或者更好的是,让另一个广播接收器监听ACTION_MY_PACKAGE_REPLACED。每当安装或更新应用程序时都会调用它,并且您可以在发生这种情况或重新启动时设置警报(因为重新启动会清除警报管理器中的警报)。然后只需在每次服务运行时重置警报即可。

作为附加提示,请查看 Android WakeLock 文档以防您尚未使用它们。如果服务启动时不设置唤醒锁,手机可能会在服务的onStartCommand之后立即进入睡眠状态。并确保即使您在服务中遇到某些错误情况(例如缺少网络连接),也已完成警报重置。

编辑:有些人遇到了ACTION_MY_PACKAGE_REPLACED 的问题。在这些情况下,可以使用ACTION_PACKAGE_REPLACED,只要代码检查它是被替换的正确包:ACTION_MY_PACKAGE_REPLACED not received

【讨论】:

  • 我在更新应用时收到“ACTION_MY_PACKAGE_REPLACED”。但它不会在新安装时触发。
  • "ACTION_PACKAGE_ADDED" 并不总是适合我。所以看来我需要在 ACTION_MY_PACKAGE_REPLACED 和 ACTION_BOOT_COMPLETED 上设置警报。此外,我需要在每次运行我的应用程序时设置警报,否则我的服务将在重新启动或应用程序更新之前启动。
猜你喜欢
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
相关资源
最近更新 更多