【问题标题】:How to make Android BroadcastReceiver resistant to an unexpected stop?如何让 Android BroadcastReceiver 抵抗意外停止?
【发布时间】:2015-05-27 22:59:19
【问题描述】:

我正在使用 AlarmManager 让后台 HTTP 请求每 2 分钟发生一次,这可能会根据响应向用户发出通知。此代码在每个请求之前运行,调度后续请求:

AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, MyReceiver.class);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP
    , SystemClock.elapsedRealtime() + CHECK_INTERVAL
    , PendingIntent.getBroadcast(context, 0, intent, 0));

有时会发生异常,但根据日志,是在成功完成对manager.set 的调用之后。不幸的是,I'm finding the alarm does not fire 在意外停止后。 更正:没有触发,可能是因为用户确认“意外弹出”对话框需要超过 2 分钟。

有没有办法让我的“调度”具有抗崩溃性?用户在看到意外停止消息后并不总是重新启动此特定应用程序。

由于大多数人无法在 Google Play 商店中使用该应用,我正在考虑实现错误报告和auto-restart via Thread.setDefaultUncaughtExceptionHandler(),但我目前还没有准备好开发那么远;因为这样我们就失去了通过 Google Play 获得本地错误报告的可能性。有没有更好的方法让 HTTP 请求在崩溃后继续,或者就是这样?

我知道修复崩溃的原因也会解决它,但我并不完美,所以我们应该有一个后备计划。

【问题讨论】:

  • 您可以尝试通过服务作为进程设置警报。
  • 为什么你不使用setRepeating(),而不是set(),因为你的时间间隔是固定的?诚然,这可能是一个短期解决方案,因为一旦您的 targetSdkVersion 达到 19 或更高,就没有更多的精确重复选项,但它可能是您进一步试验时的权宜之计。
  • @Commons,我不知道你可以。那会防撞吗?
  • 我的猜测是它会更好。但是,请理解您链接到的我的答案是针对非常具体的行为:用户进入“设置”并单击“强制停止”。我的回答没有解决未处理的异常,AFAIK 不会影响已安排的警报。
  • @CommonsWare,感谢您指出这一点。我误解了。我认为这是在单击“崩溃”(现在称为“意外停止”)对话框上的“强制停止”(已重命名)按钮之后。

标签: android crash alarmmanager


【解决方案1】:

正如 CommonsWare 建议的那样,使用 setRepeating 可以工作。即使在意外停止之后,这种情况也会继续。此外,它还简化了我的代码。

使用前请参阅 Android 的文档,从 API 19 开始,它现在映射到 setInexactRepeating。这仍然会平均每 2 分钟运行一次警报,但是来自各种应用程序的警报会被转移到一个间隔(在我的情况下为 2 分钟),以便将多个警报组合在一起。这样可以减少唤醒次数并最大限度地延长手机睡眠时间,从而延长电池寿命。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2014-11-28
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多