我在接近警报方面有问题。我在我的Android应用程序上设置了设置,用户可以在其中禁用/启用某些位置的近距离警报。当他们禁用接近警报时,一切正常,不会通知它们,但是如果他们禁用并重新启用接近性警报,它将再次添加,当他们到达位置等时,他们将获得两次通知。因此,基本上每次重新启用它时,都会创建一个新的接近警报。
这是我用来删除接近警报的代码:
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);
}
我对FLAG_CANCEL_CURRENT
的理解是,它告诉系统旧的待处理意图不再有效,它应该取消它,然后创建一个新鲜的。如果我错了,请纠正我。我相信,这就是为什么您要使用每个取消和创建来复制接近警报的原因。
分辨率:
在您的removeProximityAlert
中,我会更改以下行
PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_CANCEL_CURRENT);
to:
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();
问题是,每次添加警报时,您都在注册接收器。您应该只注册一次。