Как удалить уведомление из панели уведомлений программно в Android?

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

Я использовал, чтобы отменить уведомление, используя следующий метод.

AlarmManager am=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(Display.this, TwoAlarmService.class);
PendingIntent pi = PendingIntent.getBroadcast(Display.this, AlarmNumber, intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.cancel(pi);

Но проблема в том, что уведомление уже сработало, но оно не было удалено из панели уведомлений.

Заранее спасибо...

5 ответов

Решение

Может быть, попробуйте это:

NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(NOTIFICATION_ID);

ИЛИ, вы также можете сделать это, чтобы отменить все уведомления в данном контексте:

notificationManager.cancelAll();

Смотрите эту ссылку на документацию: NotificationManager

Я считаю, что самый ПОСЛЕДНИЙ и ОБНОВЛЕННЫЙ способ сделать это (Kotlin и Java) должен быть выполнен как:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Или отменить все уведомления:

NotificationManagerCompat.from(context).cancelAll()

Сделано для AndroidX или библиотек поддержки.

Уведомления остаются видимыми, пока не произойдет одно из следующих действий:

Пользователь отклоняет уведомление либо по отдельности, либо с помощью "Очистить все" (если уведомление можно очистить). Пользователь щелкает уведомление, и вы вызывали setAutoCancel() при создании уведомления. Вы вызываете метод отмены () для получения определенного идентификатора уведомления. Этот метод также удаляет текущие уведомления. Вы вызываете cancelAll(), который удаляет все ранее отправленные уведомления. Если вы устанавливаете тайм-аут при создании уведомления с помощью setTimeoutAfter(), система отменяет уведомление по истечении заданной продолжительности. При необходимости вы можете отменить уведомление до истечения заданного времени ожидания public void cancelNotification() {

    String ns = NOTIFICATION_SERVICE;
    NotificationManager nMgr = (NotificationManager) getActivity().getApplicationContext().getSystemService(ns);
    nMgr.cancel(NOTIFICATION_ID);
}

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

В сервис вам нужно позвонить cancelAllNotifications(),

Служба должна быть включена для вашего приложения через "Приложения и уведомления" -> "Доступ к специальному приложению" -> "Доступ к уведомлениям".

Добавить в манифест:

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:label="Test App" android:name="com.test.NotificationListenerEx" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
        <intent-filter>
            <action android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>
    </service>

Затем в коде;

public class NotificationListenerEx extends NotificationListenerService {


public BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationListenerEx.this.cancelAllNotifications();
    }
};


@Override
public void onNotificationPosted(StatusBarNotification sbn) {
    super.onNotificationPosted(sbn);
}

@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
    super.onNotificationRemoved(sbn);
}

@Override
public IBinder onBind(Intent intent) {
    return super.onBind(intent);
}

@Override
public void onDestroy() {
    unregisterReceiver(broadcastReceiver);
    super.onDestroy();
}

@Override
public void onCreate() {
    super.onCreate();
    registerReceiver(broadcastReceiver, new IntentFilter("com.test.app"));
}

После этого используйте широковещательный приемник для запуска очистки всех.

Для тех, кто использовал (через подкласс) Service class и запустите его, используя:

      final Intent serviceIntent = new Intent(context, YourNotificationService.class)
ContextCompat.startForegroundService(context, serviceIntent)

закрыть его можно так:

      context.stopService(new Intent(context, YourNotificationService.class))
Другие вопросы по тегам