重新添加后,接近警报触发两次

4
我遇到了接近警报的问题。在我的安卓应用中,我有一些位置的设置,用户可以禁用/启用接近警报。当他们禁用接近警报时,所有功能都很好,并且不会收到通知,但是如果他们禁用并重新启用接近警报,则它会再次添加,当他们到达位置时就会收到两次通知等等。因此,每次他们重新启用它时,它都会创建一个新的接近警报。
以下是我用于删除接近警报的代码:
private void removeProximityAlert(int id) {
    final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );
    Intent intent = new Intent(PROX_ALERT_INTENT + id);
    PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    manager.removeProximityAlert(proximityIntent);
}

这是我用来添加接近警报的代码:

private void addProximityAlert(double latitude, double longitude, int id, int radius, String title) {
    final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );
    Intent intent = new Intent(PROX_ALERT_INTENT + id);
    PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    manager.addProximityAlert(
           latitude,
           longitude,
           radius,
           -1,
           proximityIntent
    );

    IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT + id);
    registerReceiver(new ProximityIntentReceiver(id, title), filter);
}

你尝试过使用 PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT).cancel(); 吗?添加 cancel 可以“取消当前活动的 PendingIntent。只有拥有 PendingIntent 的原始应用程序才能取消它。” - jnthnjns
FLAG_UPDATE_CURRENT 将返回现有的 PendingIntent,而 cancel() 则按其名称执行。 - jnthnjns
2个回答

1

我对FLAG_CANCEL_CURRENT的理解是,它告诉系统旧的挂起意图不再有效,应该取消它,然后创建一个新的。如果我错了,请纠正我。我相信这就是为什么每次取消和创建时都会复制接近警报。

解决方案:

在您的removeProximityAlert中,我会更改以下行:

PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_CANCEL_CURRENT);

至:

PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT).cancel();

FLAG_UPDATE_CURRENT 如果存在则返回现有的,cancel() 会为您处理其余部分。


编辑

如果我将cancel()分成单独的一行,就不会出现任何错误。请尝试这样做:

PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
proximityIntent.cancel();

当我使用cancel()时,它会在那一行给我一个错误提示:"类型不匹配:无法将void转换为PendingIntent"。 - edoniti
@edoniti,抱歉,我尝试时也遇到了相同的错误。请参见上面的编辑。 - jnthnjns
我尝试了一下,但它没有起作用。当我在设置中将接近警报复选框设置为“关闭”时,它运行得很好,因此当您到达某个位置时,它不会通知您,但是当我重新启用它时,它会通知两次。如果我卸载应用程序,然后再次安装它,它会一直正常工作,直到我更改应用程序中的接近警报设置。例如,如果我禁用/启用4次设置,则会收到5个接近警报通知。 - edoniti

0
问题在于每次添加闹钟时都会注册接收器。您应该只注册一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接