Как удалить уведомление после того, как действие было нажато

Поскольку уровень API 16 (Jelly Bean), есть возможность добавить действия к уведомлению с помощью

builder.addAction(iconId, title, intent); 

Но когда я добавляю действие к уведомлению и действие нажимается, уведомление не будет отклонено. Когда кликнуто само уведомление, его можно

 notification.flags = Notification.FLAG_AUTO_CANCEL; 

или

 builder.setAutoCancel(true); 

Но, очевидно, это не имеет ничего общего с действиями, связанными с уведомлением.

Любые намеки? Или это еще не часть API? Я ничего не нашел.

Solutions Collecting From Web of "Как удалить уведомление после того, как действие было нажато"

Когда вы вызвали уведомление в диспетчере уведомлений, вы дали ему идентификатор – это уникальный идентификатор, который вы можете использовать для доступа к нему позже (это из диспетчера уведомлений:

 notify(int id, Notification notification) 

Чтобы отменить, вы должны позвонить:

 cancel(int id) 

С тем же идентификатором. Итак, в основном, вам нужно отслеживать идентификатор или, возможно, добавить идентификатор в пакет, который вы добавляете к намерению внутри PendingIntent?

Обнаружено, что это проблема при использовании уведомления Lollipop Heads Up Display. См. Рекомендации по проектированию . Вот полный (ish) код для реализации.

До сих пор наличие кнопки «Dismiss» было менее важным, но теперь это больше похоже на ваше лицо.

Уведомление о начале

Создание уведомления

 int notificationId = new Random().nextInt(); // just use a counter in some util class... PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style .setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission .setSmallIcon(R.drawable.ic_action_refresh) // Required! .setContentTitle("Message from test") .setContentText("message") .setAutoCancel(true) .addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent) .addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent); // Gets an instance of the NotificationManager service NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // Builds the notification and issues it. notifyMgr.notify(notificationId, builder.build()); 

NotificationActivity

 public class NotificationActivity extends Activity { public static final String NOTIFICATION_ID = "NOTIFICATION_ID"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1)); finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately } public static PendingIntent getDismissIntent(int notificationId, Context context) { Intent intent = new Intent(context, NotificationActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.putExtra(NOTIFICATION_ID, notificationId); PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); return dismissIntent; } } 

AndroidManifest.xml (атрибуты, необходимые для предотвращения фокусировки SystemUI на задний стек)

 <activity android:name=".NotificationActivity" android:taskAffinity="" android:excludeFromRecents="true"> </activity> 

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

Вы должны вручную отменить свое уведомление, когда пользователь нажимает кнопку действия. Уведомление отменяется автоматически только для действия по умолчанию.

Также, если вы запускаете широковещательный приемник с помощью кнопки, ящик уведомлений не закрывается.

Я решил создать новую NotificationActivity для решения этих проблем. Эта промежуточная деятельность без какого-либо пользовательского интерфейса отменяет уведомление, а затем начинает действие, которое я действительно хотел начать с уведомления.

Я разместил образец кода в связанной записи. Нажатие кнопки «Уведомления Android» не закрывает ящик уведомлений .

В моем опыте использование BroadcastReceiver является более чистым способом отмены уведомления:

В AndroidManifest.xml:

 <receiver android:name=.NotificationCancelReceiver" > <intent-filter android:priority="999" > <action android:name="com.example.cancel" /> </intent-filter> </receiver> 

В java Файл:

 Intent cancel = new Intent("com.example.cancel"); PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Action actions[] = new NotificationCompat.Action[1]; NotificationCancelReceiver public class NotificationCancelReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Cancel your ongoing Notification }; } 

Вы всегда можете cancel() Notification из того, что вызвано действием (например, в onCreate() активности, связанной с PendingIntent вы предоставляете addAction() ).