android - 使用 AlarmManager 和 Broadcast Receiver 启动 Android 服务

标签 android service alarmmanager

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

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

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

  • 因此,另一种选择是在用户首次运行应用程序时创建警报。
  • 如果用户重新启动应用程序会怎样?我是否应该使用 AlarmManager.cancel 取消所有以前的警报并重新创建警报?

那么您在什么情况下为您的 Android 应用程序设置警报?

最佳答案

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

作为额外的提示,如果您还没有使用它们,请查看 Android WakeLock 文档。如果服务启动时没有设置唤醒锁,手机可能会在服务的 onStartCommand 之后立即进入休眠状态。即使您在服务中遇到某些错误情况(例如,网络连接丢失),也要确保重置警报。

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

关于android - 使用 AlarmManager 和 Broadcast Receiver 启动 Android 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19643491/

相关文章:

android - Android 应用程序的评论部分

android - <shape> 中只有顶角变圆

android - 在android studio中创建.so文件并在Android中的另一个应用程序中使用它

android - 如何访问服务中存在的变量

java - 按计划显示电子邮件的 Intent

android - 警报管理器不工作

java - 如何在 Android 应用程序中的屏幕之间交换文本

java - 我想在启动后从另一个服务调用服务方法,但我不知道如何创建该服务的对象

java - 服务在 onCreate 时崩溃并出现 nullpointerException

android - 设置 AlarmManager 的最佳时机/位置