【发布时间】: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