Wie entferne ich die Benachrichtigung programmgesteuert aus der Benachrichtigungsleiste in Android?

74

Jeder hat eine Idee, wie wir Benachrichtigungen programmgesteuert aus der Anwendung entfernen können, die mit Pending Intent aufgerufen werden.

Ich habe die Benachrichtigung mit der folgenden Methode abgebrochen.

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

Das Problem ist jedoch eine Benachrichtigung, die bereits ausgelöst wurde und nicht aus der Benachrichtigungsleiste entfernt wurde.

Danke im Voraus...

Geben Sie hier die Bildbeschreibung ein

Jayeshkumar Sojitra
quelle
Hallo, ich weiß nicht, ob es möglich ist, Benachrichtigungsprogramme systematisch zu entfernen, aber Sie können die alte Benachrichtigung durch eine neue überschreiben, die sicher ist. Wenn es Ihren Anforderungen entspricht, kann ich hier eine Postleitzahl für Sie veröffentlichen. Bitte antworten Sie
Brijesh Patel
Nein, eigentlich habe ich zwei verschiedene Benachrichtigungen und storniere die Benachrichtigung bereits.
Jayeshkumar Sojitra

Antworten:

208

Vielleicht versuchen Sie Folgendes:

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

ODER Sie können dies auch tun, um alle Benachrichtigungen in einem bestimmten Kontext abzubrechen:

notificationManager.cancelAll();

Siehe diesen Link zur Dokumentation: NotificationManager

Android
quelle
7
Ich verstehe den Punkt nicht, if (Context.NOTIFICATION_SERVICE != null)weil das eine String-Konstante ist und niemals null sein wird.
Teer
5
Sie haben Recht, dieser Test ist nutzlos, ich weiß nicht, warum ich es getan habe (gelöscht): /
An-Droide
@Matthieu es hat vor 4 Jahren funktioniert ... :) Momentan nicht überprüft. Bitte lassen Sie mich wissen, wenn es auf keinen Fall funktioniert.
Jayeshkumar Sojitra
@ JayeshSojitra Ich war nur neugierig, wer von cancel(NOTIFICATION_ID)oder cancelAll()den Trick gemacht hat. Falls Ihre Erinnerung so weit zurückgegangen ist, ist es keine große Sache :)
Matthieu
1
@ Matthieu In meinem Fall haben beide funktioniert. Wenn Sie eine bestimmte stornieren möchten, verwenden Sie Abbrechen (NOTIFICATION_ID). Wenn Sie alle Benachrichtigungen abbrechen möchten, verwenden Sie den Benutzer cancelAll ().
Jayeshkumar Sojitra
4

Benachrichtigungen bleiben sichtbar, bis eine der folgenden Aktionen ausgeführt wird:

Der Benutzer schließt die Benachrichtigung entweder einzeln oder mit "Alle löschen" ab (wenn die Benachrichtigung gelöscht werden kann). Der Benutzer klickt auf die Benachrichtigung und Sie haben setAutoCancel () aufgerufen, als Sie die Benachrichtigung erstellt haben. Sie rufen cancel () für eine bestimmte Benachrichtigungs-ID auf. Diese Methode löscht auch laufende Benachrichtigungen. Sie rufen cancelAll () auf, wodurch alle zuvor ausgegebenen Benachrichtigungen entfernt werden. Wenn Sie beim Erstellen einer Benachrichtigung mit setTimeoutAfter () ein Zeitlimit festlegen, bricht das System die Benachrichtigung nach Ablauf der angegebenen Dauer ab. Bei Bedarf können Sie eine Benachrichtigung abbrechen, bevor die angegebene Zeitüberschreitungsdauer abgelaufen ist

public void cancelNotification() {

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

Alle Benachrichtigungen (auch andere App-Benachrichtigungen) können durch Abhören von 'NotificationListenerService' entfernt werden, wie in NotificationListenerService Implementation erwähnt

Im Service müssen Sie anrufen cancelAllNotifications().

Der Dienst muss für Ihre Anwendung über "Apps & Benachrichtigungen" -> "Spezieller App-Zugriff" -> "Benachrichtigungszugriff" aktiviert werden.

Zum Manifest hinzufügen:

    <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>

Dann im Code;

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

Verwenden Sie danach den Rundfunkempfänger, um das Löschen aller auszulösen.

Gemäß dem obigen Code, um die Broadcast-Verwendung auszulösen;

getContext().sendBroadcast(new Intent("com.test.app"));
Samantha
quelle
Ich weiß nicht, warum Sie diese Antwort gepostet haben, wenn sie bereits akzeptiert wird. Stackoverflow.com/a/19268653/1404774 .
Jayeshkumar Sojitra
Haben Sie ein bestimmtes Szenario, in dem die obige Frage nicht funktioniert?
Jayeshkumar Sojitra
Das Obige funktioniert nicht für alle Benachrichtigungen (alle 'App'-Benachrichtigungen). Dadurch werden nur aktuelle, von der App erstellte Benachrichtigungen entfernt.
Samantha
Wie auslösen? Welche Sendung senden? Kannst du bitte auch posten wie man es auslöst?
Adrian Ivasku
Gemäß dem obigen Code wäre es; getContext (). sendBroadcast (neue Absicht ("com.test.app");
Samantha
1

Ich glaube, die aktuellste und aktualisierteste Vorgehensweise (Kotlin und Java) sollte wie folgt durchgeführt werden:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Oder alle Benachrichtigungen abzubrechen ist:

NotificationManagerCompat.from(context).cancelAll()

Gemacht für AndroidX oder Support-Bibliotheken.

Xenolion
quelle