2

我有一个导航应用程序。我想获得可能暂时无法到达的位置信息,具体取决于GPS锁定需要多长时间 - 或者接收状况不佳。

我打算用它LocationManager.requestLocationUpdates()来请求位置信息在可用时发送到一个BroadcastReciever,并通过 AlarmManager.set().

如果位置更新到达,我想取消超时。如果超时到达,我想取消位置更新。假设我的应用程序可以在任何一种情况发生之前被杀死,我就会失去PendingIntent我想要取消的东西。

有没有办法以PendingIntent某种方式保存,所以我可以稍后使用它们来取消超时和/或位置更新?还是有更好的方法来解决这个问题?

4

1 回答 1

2

您不需要保存 PendingIntent 实例本身。AlarmManager.cancel(PendingIntent operation) 的文档说,

删除任何具有匹配 Intent 的警报。任何类型的任何警报,其 Intent 与此匹配(由 filterEquals(Intent) 定义)都将被取消。

如果您查看 Intent.filterEquals(Intent),它会说,

出于意图解析(过滤)的目的,确定两个意图是否相同。也就是说,如果它们的动作、数据、类型、类和类别相同。这不会比较意图中包含的任何额外数据。

因此,您可以使用相同的操作创建一个 PendingIntent 并使用该新的待处理意图执行 am.cancel() ,它也会取消先前的待处理意图。

这是一个快速的代码示例:

private static final String ALARM_ACTION = "foo.bar.MY_ALARM_ACTION";

private PendingIntent getAlarmIntent() {
Intent alarmIntent = new Intent(ALARM_ACTION);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); // or whatever flag you need
return pi;
}

现在您可以使用从上述函数返回的 PendingIntent 调用 am.set(),也可以使用从同一函数返回的 PendingIntent 调用 am.cancel()。PendingIntent 是否是同一个实例并不重要,它只需要匹配 Intent.filterEquals() 测试(所以基本上只有 Intent 操作必须匹配)。

因此,基本上只需使用相同的操作来创建设置/取消警报的意图,它就会起作用。

于 2012-10-23T06:43:20.947 回答