2016-02-06 11 views
8

Ho una notifica personalizzato con un pulsante di azione:Congeda la notifica corrente sulla lotta cliccato

public class NotificationReceiver extends com.parse.ParsePushBroadcastReceiver { 
    @Override 
    public void onPushReceive(Context context, Intent intent) { 

    ... 

    NotificationActivity notification = new NotificationActivity(); 
    notification.createNotification(context, message, notificationId); 

    Log.i("tag", "Notification Received!"); 
} 

public class NotificationActivity { 

    public int notificationId; 

    public void createNotification(Context context, String message, String studentId, String notificationId){ 
     this.notificationId = Integer.parseInt(notificationId); 

     // manager 
     NotificationManager notificationManager = 
     (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 

     // notification 
     Notification.Builder mBuilder = new Notification.Builder(context); 
     mBuilder.setContentTitle("My Title"); 
     mBuilder.setContentText(message); 
     mBuilder.setDefaults(Notification.DEFAULT_VIBRATE); 
     mBuilder.setAutoCancel(true); 
     mBuilder.setStyle(new Notification.BigTextStyle() 
      .bigText(message)); 

     // cancel intent 
     Intent cancelIntent = new Intent(context, CancelNotification.class); 
     Bundle extras = new Bundle(); 
     extras.putInt("notification_id", this.notificationId); 
     cancelIntent.putExtras(extras); 
     PendingIntent pendingCancelIntent = 
      PendingIntent.getBroadcast(context, 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT) ; 
     mBuilder.addAction(R.drawable.notification_close, "Fechar", pendingCancelIntent); 

     // notify 
     Notification notification = mBuilder.build(); 
     notificationManager.notify(Integer.parseInt(notificationId), notification); 
    } 

    public static class CancelNotification extends BroadcastReceiver { 

     private int id; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      id = intent.getIntExtra("notification_id", 1); 
      NotificationManager notificationManager = 
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
      notificationManager.cancel(id); 
     } 
    } 
} 

voglio annullare notifica che ho cliccato sul pulsante "Chiudi".

So che ho bisogno dell'id della notifica per cancellarlo, ma il modo in cui ho fatto il codice, quando clicco sul pulsante "Chiudi" e creo la classe CancelNotification che estende BroadCastReceiver sto ricevendo l'ID di notifica l'ultima notifica, e così, sta chiudendo l'ultima notifica anche se clicco sulla prima notifica che ho creato.

Cosa potrei fare di sbagliato?

+0

Hai provato ad aggiungere Notification.FLAG_AUTO_CANCEL? Questa bandiera ha il comportamento che ti aspetti? – W0rmH0le

+0

Ho aggiornato la domanda con tutto ciò che ho in notification.builder. Proprio ora quando clicco sul pulsante "Chiudi", non fa proprio nulla. – Ravers

+0

Quando si fa clic su questi pulsanti, l'intento viene trasmesso al sistema. Forse, è necessario gestire l'intento. Prova questo asnwer: http://stackoverflow.com/q/16869777/4860513 – W0rmH0le

risposta

4

l'ho trovato

È pendingIntent è sempre l'invio di richiesta del codice == 0;

Poiché si dispone di più notifiche, ciascuna deve utilizzare un codice di richiesta diverso.

Quindi, cercare di cambiare:

Da:

PendingIntent pendingCancelIntent = 
     PendingIntent.getBroadcast(context, 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT) ; 

A:

PendingIntent pendingCancelIntent = 
     PendingIntent.getBroadcast(context, this.notificationId, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT) ; 

ho provato qui il codice e che sta funzionando dopo il cambiamento che ho fatto.

+0

Lo sapevo anche hahah Durante i miei test, ho accidentalmente inserito l'ID invece di "0" e funzionava. Durante il controllo del perché, noto questa differenza e voilà !! Cordiali saluti – W0rmH0le

+0

ma ... se l'ID di notifica viene recuperato con "id = intent.getIntExtra (" notification_id ", 1);" perché il cambiamento che suggerisci - che è un cambio di parametro - lo fa funzionare? –

+0

Il problema in questo problema si verificava durante la creazione dell'intento. L'intento è sempre stato creato con ID = 0. Quindi, getIntExtra ("notification_id", 1) restituisce sempre 0 e quindi, solo l'ultima notifica ricevuta è stata annullata (anche facendo clic sulla prima notifica) ... – W0rmH0le

1

È sempre preferibile utilizzare un builder di notifica. Ecco un esempio:

NotificationCompat.Builder mBuilder=new NotificationCompat.Builder(this); 
    mBuilder.setContentTitle("Your title"); 
    mBuilder.setOnlyAlertOnce(true); 
    mBuilder.setAutoCancel(true); 
    mBuilder.setContentText("main content") 
    mBuilder.setSubText("subtext") 

Poi si deve creare un intento di quale attività si desidera aprire la notifica cliccato

intent = new Intent(this, MainActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK); 

Quindi creare il tuo manager di notifica

notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 

    Notification notification = mBuilder.build(); 
    notification.flags = Notification.FLAG_AUTO_CANCEL; 
    notificationManager.notify(notificationID, notification); 

notificationID può essere qualsiasi valore intero. L'uso di questo tipo ti dà il vantaggio di seguire sempre le norme di Android per le notifiche.

+0

cool, ma come fare si recupera l'ID di notifica nel BroadcastReceiver per essere sicuri di annullare la notifica corretta? –

Problemi correlati