2012-09-30 18 views
22

C'è qualche modo in Android per rilevare quando un utente scorre una notifica a sinistra e la elimina? Sto utilizzando un gestore di allarmi per impostare un avviso ripetuto e ho bisogno che il mio avviso ripetuto si fermi quando la notifica viene annullata dall'utente. Ecco il mio codice:Come rilevare se una notifica è stata respinta?

Impostazione avviso ripetuto:

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), repeatFrequency, displayIntent); 

mio codice di notifica:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //Get the notification ID. 
    int notifID = getIntent().getExtras().getInt("Reminder_Primary_Key"); 

    //Get the name of the reminder. 
    String reminderName = getIntent().getExtras().getString("Reminder_Name"); 

    //PendingIntent stores the Activity that should be launched when the user taps the notification. 
    Intent i = new Intent(this, ViewLocalRemindersDetail.class); 
    i.putExtra("NotifID", notifID); 
    i.putExtra("notification_tap", true); 

    //Add FLAG_ACTIVITY_NEW_TASK to stop the intent from being launched when the notification is triggered. 
    PendingIntent displayIntent = PendingIntent.getActivity(this, notifID, i, Intent.FLAG_ACTIVITY_NEW_TASK); 

    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    Notification notif = new Notification(R.drawable.flag_red_large, reminderName, System.currentTimeMillis()); 

    CharSequence from = "Here's your reminder:"; 

    CharSequence message = reminderName;   
    notif.setLatestEventInfo(this, from, message, displayIntent); 

    //Pause for 100ms, vibrate for 250ms, pause for 100ms, and vibrate for 500ms. 
    notif.defaults |= Notification.DEFAULT_SOUND; 
    notif.vibrate = new long[] { 100, 250, 100, 500 }; 
    nm.notify(notifID, notif); 

    //Destroy the activity/notification. 
    finish(); 

} 

so che ho bisogno di chiamare alarmManager.cancel(displayIntent) per annullare la mia sveglia ripetizione. Tuttavia, non capisco dove mettere questo codice. Devo annullare l'avviso di ripetizione SOLO quando l'utente ha toccato la notifica o l'ha respinta. Grazie per l'aiuto!

+2

Non importa, ho trovato la mia risposta qui: http://stackoverflow.com/questions/8811876/notification-deleteintent-does-not-work. – NewGradDev

risposta

15

Credo che Notification.deleteIntent sia quello che stai cercando. Il documento dice:

L'intenzione di eseguire quando la notifica viene esplicitamente ignorata dall'utente, con il pulsante "Cancella tutto" o spostandolo singolarmente. Questo probabilmente non dovrebbe essere l'avvio di un'attività poiché molti di questi verranno inviati contemporaneamente.

+7

Come? Potete aiutare fornendo un codice di esempio? –

+0

Questa soluzione mi ha aiutato: https://stackoverflow.com/a/14723652/563509 – masterwok

0

Per tutte quelle persone future là fuori - è possibile registrare un ricevitore di trasmissione per ascoltare la notifica di elementi di eliminazione.

Creare un nuovo ricevitore di broadcast:

public class NotificationBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     if (action == null || !action.equals(Config.NotificationDeleteAction)) { 
      return; 
     } 

     // Do some sweet stuff 
     int x = 1; 
    } 
} 

registrare il ricevitore di trasmissione all'interno della vostra classe di applicazione:

"Se i tuoi obiettivi app livello di API 26 o superiore, non è possibile utilizzare il manifesto dichiarare un ricevitore per la maggior parte delle trasmissioni implicite (trasmissioni che non indirizzano specificamente la tua app). "

Android Documentation.

registerReceiver(
     new NotificationBroadcastReceiver(), 
     new IntentFilter(Config.NotificationDeleteAction) 
); 

probabilmente avete notato la variabile statica Config.NotificationDeleteAction. Questo è un identificatore di stringa univoco per la tua notifica. Ne consegue in genere il seguente {namespace} {} ActionName convenzione:

you.application.namespace.NOTIFICATION_DELETE

Impostare l'intento di eliminazione sul vostro costruttore di notifica:

notificationBuilder 
     ... 
     .setDeleteIntent(createDeleteIntent()) 
     ... 

Dove, createDeleteIntent è il seguente metodo:

private PendingIntent createDeleteIntent() { 
    Intent intent = new Intent(); 
    intent.setAction(Config.NotificationDeleteAction); 

    return PendingIntent.getBroadcast(
      context, 
      0, 
      intent, 
      PendingIntent.FLAG_ONE_SHOT 
    ); 
} 

Il destinatario della trasmissione registrata deve ricevere l'intento quando la notifica viene chiusa.

Problemi correlati