无法移除近距离警报

时间:2015-09-23 10:50:35

标签: android notifications alert android-pendingintent proximity

用户可以通过开关来激活或停用接近警报。

当用户激活此开关时,接近警报将以通知方式显示。通过操作栏上的此通知,如果用户将开关更改为"则停用"模式,通知消失。它运作正常。

但我的问题是:

我激活了警报,但在那一刻它没有显示任何内容,因为我不在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();
}

我已阅读此帖:

Post1

Post2

Post3

2 个答案:

答案 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()方法并确保您的意图符合此处所述的标准。