【问题标题】:Clarification of AlarmManager behavior in Android澄清 Android 中的 AlarmManager 行为
【发布时间】:2011-02-21 23:25:05
【问题描述】:

我看到了所有由 Activity 设置的 AlarmManager 示例。

我的问题是: 如果我的应用程序设置了重复的 AlarmManager,即使在启动的应用程序关闭并从内存中删除后,这种情况是否仍然存在?

如果没有,我如何在启动时由 Android 启动的较低级别启动 AlarmManager,如果它失败或死亡或抛出异常,则无需用户执行任何操作即可重新启动?

最后,如果我希望 BroadcastReceiver 执行的操作没有可视化组件,我还需要为它创建一个单独的 Activity 吗?就我而言,我希望有一个后台上传器唤醒并查看文件夹,如果它看到该文件夹​​中的文件,则将它们发送到服务器。我不需要任何反馈给用户。

所以,我的理想是拥有一个神奇的、基于操作系统的 AlarmManager,它调用一个仅处理上传的 IntentService,但我不清楚如何让这样的 AlarmManager 首先运行。

TIA

【问题讨论】:

  • 如果将应用移至外部存储并设置警报然后移除存储会发生什么情况,在这种情况下警报将如何表现以及如何处理这种情况。

标签: android alarmmanager


【解决方案1】:

是的,AFAIK 警报“存活”并不断被触发,即使在注册它们的活动结束后也是如此。但它们无法在手机重启后存活。

如果我正确理解了您的问题,我认为您可以通过创建一个带有广播接收器的项目来实现您的目标,该接收器侦听 android.intent.action.BOOT_COMPLETED 意图,然后(重新)注册一个重复警报,这依次启动 (Intent)Service 进行上传。

你不需要一个活动,但你可能还是想要一个活动,让用户通过选中一个复选框或其他东西来暂时禁用上传机制。让用户选择警报的频率也可能会很好,即服务应该多久启动一次并寻找要上传的新文件。这也是第一次注册闹钟的好地方。

【讨论】:

  • 我在另一个 SO 线程中找到了所有这些问题的所有答案...stackoverflow.com/questions/3859489/…。然而,你是正确的。
  • 旁注:在 Android 2.1 及更早版本上,“任务杀手”会清除您的警报。
  • @Dr.Dredel:关于您下面关于竞争警报的问题,这应该不是问题。来自警报管理器的 javadoc:“如果已安排此 Intent 的警报(filterEquals(Intent) 定义了两个 Intent 的相等性),那么它将被删除并替换为这个。”因此,如果您在应用程序和启动时都使用“相同”的挂起意图,这将确保一次只有一个警报处于活动状态。
  • @CommonsWare 如果将应用程序移至外部存储并设置警报然后删除存储会发生什么情况,在这种情况下警报将如何表现以及如何处理这种情况
  • @user606669:请勿在需要警报的外部存储上安装应用程序:developer.android.com/guide/topics/data/…
【解决方案2】:

我同意 Nicolai 的观点,即您的应用程序中有 2 个广播接收器:

  • 在启动时重新注册警报
  • 在警报触发时启动您的服务

您仍然可以有一个活动,但它不应该由警报接收器启动(因此服务):相反,可能会在您启动服务时启动一个通知,用户可以从通知的扩展消息。

也许还可以考虑使用 setInexactRepeating(而不是 setRepeating)作为警报,以及使用工作线程来处理长上传(以防用户希望同时在主线程中使用您的活动)。

【讨论】:

  • 作为一个附带问题,我如何避免设置两个警报(一个由应用程序设置,一个由启动设置?)。我不希望他们互相竞争。有没有办法在启动另一个之前查看一个是否已经在运行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
相关资源
最近更新 更多