用户可以通过开关来激活或停用接近警报。
当用户激活此开关时,接近警报将以通知方式显示。通过操作栏上的此通知,如果用户将开关更改为"则停用"模式,通知消失。它运作正常。
但我的问题是:
我激活了警报,但在那一刻它没有显示任何内容,因为我不在POI附近。我已经改变了主意,现在,我不想要任何警报,所以我将开关改为"停用"模式(操作栏上出现任何通知)。
但是,打开"停用"模式,当我在POI附近时,警报将出现在操作栏上,我不知道原因。 我使用removeProximityAlert和每个POI的待定意图值。
要激活提醒:
public void activateAlerts() {
Database db = new Database(getApplicationContext());
Cursor cursor = db.getPois();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
while (cursor.moveToNext()) {
...
Intent intent = new Intent(PROX_ALERT_INTENT);
String idSubstring = id.substring(7);
int lastDigitsOfID = Integer.parseInt(idSubstring);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), lastDigitsOfID, intent, PendingIntent.FLAG_ONE_SHOT);
try {
locationManager.addProximityAlert(latitude, longitude, Utils.RADIOALERTS, -1, pi);
} catch (Exception e) {
Log.e(getClass().getSimpleName().toString(), e.toString());
}
notifications.add(new NotificationObject(cursor.getString(idIndex), lastDigitsOfID));
}
db.addNotifications(notifications);
}
停用提醒:
public void deactivateAlerts() {
Database db = new Database(getApplicationContext());
Cursor cursor = db.getIdPendingIntents();
int idPendingIntentIndex = cursor.getColumnIndex("id_pendingintent");
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
while (cursor.moveToNext()) {
Intent intent = new Intent(PROX_ALERT_INTENT);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
cursor.getInt(idPendingIntentIndex), intent, 0);
locationManager.removeProximityAlert(pendingIntent);
}
NotificationManager notificationManager =
(NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();
}
我已阅读此帖:
答案 0 :(得分:1)
您的问题是使用PendingIntent.FLAG_ONE_SHOT
。这个文档没有很好的记录,但是如果你删除那个标志就应该有效。
当您使用PendingIntent
创建FLAG_ONE_SHOT
时,Android不会跟踪此PendingIntent
(因为它只允许使用一次)。在我看来,这是一个优化"这实际上是一个Android bug: - (
当您致电removeProximityAlert()
并将其传递给PendingIntent
时,该方法中的代码会尝试取消所有匹配 PendingIntent
的邻近警报。由于Android没有跟踪PendingIntent
创建的FLAG_ONE_SHOT
,因此"匹配"代码永远不会找到您的接近警报,因此它不会取消它。
答案 1 :(得分:0)
这真的一样吗?
启用:强>
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), lastDigitsOfID, intent, PendingIntent.FLAG_ONE_SHOT);
停用强>
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),cursor.getInt(idPendingIntentIndex), intent, 0);
请查看intentEquals()方法并确保您的意图符合此处所述的标准。