2016-02-06 3 views
8

У меня есть пользовательское уведомление с помощью кнопки действия:Отклонить текущее уведомление о Действии щелкнуло

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); 
     } 
    } 
} 

Я хочу, чтобы отменить уведомление, которое я нажал на кнопку действия «Закрыть».

Я знаю, что мне нужен идентификатор уведомления, чтобы отменить его, но так, как я сделал код, когда я нажимаю кнопку «Закрыть» и создаю класс CancelNotification, который расширяет BroadCastReceiver. Я получаю идентификатор уведомления последнее уведомление, и поэтому закрывает последнее уведомление, даже если я нажму на первое созданное мной уведомление.

Что я могу делать неправильно?

+0

Вы пытались добавить Notification.FLAG_AUTO_CANCEL? Есть ли у этого флага поведение, которое вы ожидаете? – W0rmH0le

+0

Я обновил вопрос со всем, что у меня есть в notification.builder. Прямо сейчас, когда я нажимаю кнопку «Закрыть», она просто ничего не делает. – Ravers

+0

Когда вы нажимаете эти кнопки, намерение транслируется в систему. Может быть, вам нужно справиться с намерением. Попробуйте этот asnwer: http://stackoverflow.com/q/16869777/4860513 – W0rmH0le

ответ

4

Я нашел

Вы pendingIntent всегда посылает запрос кода == 0;

Поскольку у вас есть несколько уведомлений, каждый из них должен использовать другой код запроса.

Итак, попробуйте изменить:

От:

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

To:

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

Я проверил ваш код здесь, и это работает после изменения я сделал.

+0

Я тоже знал хаха Во время моих тестов я случайно вставлял идентификатор вместо «0», и он работал. Проверяя почему, я замечаю эту разницу и вуаля !! С наилучшими пожеланиями – W0rmH0le

+0

, но ... если идентификатор уведомления извлекается с помощью «id = intent.getIntExtra (« notification_id », 1);» почему бы изменения, которые вы предлагаете, - это изменение параметра, заставляют его работать? –

+0

Проблема в этом вопросе происходила во время создания цели. Намерение всегда создавалось с ID = 0. Итак, getIntExtra ("notification_id", 1) всегда возвращает 0, а затем отменяется только последнее полученное уведомление (даже щелкнув по первому уведомлению) ... – W0rmH0le

1

Всегда лучше использовать конструктор уведомлений. Вот пример:

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

Далее вы должны создать намерение на деятельность которого вы хотите открыть на уведомления щелкнул

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

Затем создайте ваш менеджер уведомлений

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

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

notificationID можете любое целочисленное значение. Использование этого типа дает вам преимущество всегда следовать стандартам Android для уведомлений.

+0

круто, но как сделать вы получаете идентификатор уведомления в BroadcastReceiver, чтобы быть уверенным, что вы отменяете правильное уведомление? –