Як програмно видалити сповіщення з панелі сповіщень в android?


75

Будь-хто має уявлення, як ми можемо видалити повідомлення із програми програмно, яке називається за допомогою очікуваного наміру.

Я використовував для скасування повідомлення, використовуючи наступний спосіб.

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

Але проблема полягає в тому, що вже запущене сповіщення не видалено з панелі сповіщень.

Спасибі заздалегідь...

введіть тут опис зображення


привіт, я не знаю, чи можна програмно видаляти сповіщення, але ти можеш замінити старе сповіщення новим, що впевнене. якщо це fullfil ваші вимоги, то я можу поштовий індекс для вас тут. plz відповідь
Brijesh Patel

Ні, насправді у мене є два різні сповіщення, і я вже скасовую їх.
Jayeshkumar Sojitra

Відповіді:


210

Можливо, спробуйте це:

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

АБО, ви також можете зробити це, щоб скасувати всі сповіщення в заданому контексті:

notificationManager.cancelAll();

Дивіться це посилання на документацію: NotificationManager


7
Я не бачу сенсу, if (Context.NOTIFICATION_SERVICE != null)оскільки це константа рядка і ніколи не буде нульовою.
смола

5
Ви праві, цей тест марний, я не знаю, для чого я це зробив (видалив): /
An-droid

@Matthieu це працювало до 4 років ... :) Не перевірено прямо зараз. Будь ласка, повідомте мене, якщо це не працює в будь-якому випадку.
Jayeshkumar Sojitra

@JayeshSojitra Мені було просто цікаво , який з cancel(NOTIFICATION_ID)або cancelAll()зробив трюк. Якщо ваша пам'ять повернулася настільки далеко, це не велика справа :)
Матьє

1
@Matthieu У моєму випадку обидва працювали. Якщо ви хочете скасувати конкретне, використовуйте скасувати (NOTIFICATION_ID), а якщо ви хочете скасувати всі сповіщення, тоді користувач cancelAll ().
Jayeshkumar Sojitra

4

Сповіщення залишаються видимими, доки не станеться одне з наступного:

Користувач відхиляє повідомлення або окремо, або за допомогою функції "Очистити все" (якщо сповіщення можна видалити). Користувач натискає сповіщення, і ви створили сповіщення setAutoCancel (). Ви телефонуєте Cancel () для конкретного ідентифікатора сповіщення. Цей метод також видаляє поточні сповіщення. Ви викликаєте cancelAll (), який видаляє всі попередні сповіщення. Якщо ви встановлюєте час очікування під час створення сповіщення за допомогою setTimeoutAfter (), система скасовує повідомлення після закінчення зазначеної тривалості. Якщо потрібно, ви можете скасувати повідомлення до закінчення зазначеного часу очікування

public void cancelNotification() {

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

3

Усі сповіщення (навіть інші сповіщення додатків) можна видалити, прослуховуючи '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"));
}

Після цього використовуйте широкомовний приймач, щоб запустити очищення всіх.

Відповідно до наведеного вище коду для ініціювання використання трансляції;

getContext().sendBroadcast(new Intent("com.test.app"));

Не знаю, чому ви опублікували цю відповідь, коли вона вже прийнята stackoverflow.com/a/19268653/1404774 .
Jayeshkumar Sojitra

Чи є у вас конкретний сценарій, за якого вищезазначене питання не працює?
Jayeshkumar Sojitra

Вищезазначене працює не для всіх сповіщень (Усі сповіщення про програми). Це видаляє лише поточні сповіщення, створені додатком.
Саманта

Як спрацьовувати? Надіслати який ефір? Чи можете ви, будь ласка, опублікувати також, як це викликати?
Адріан Іваску

Відповідно до наведеного вище коду це було б; getContext (). sendBroadcast (новий намір ("com.test.app");
Саманта

3

Я вважаю , що найбільш нещодавно і ОНОВЛЕНО спосіб робити (Котлін і Java) , це повинно бути зроблено , як:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Або скасувати всі сповіщення:

NotificationManagerCompat.from(context).cancelAll()

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.