Как использовать Notification.deleteIntent

Я пытаюсь определить, когда мое уведомление очищается. Мой вопрос напрямую относится к этому ответу, который описывает то, что я предполагаю сделать. Вот как я реализую действия:

// usual Notification initialization here
notification.deleteIntent = PendingIntent.getService(context, 0, new Intent(context, CleanUpIntent.class), 0);
notificationManager.notify(123, notification)

Это класс CleanUpIntent:

class CleanUpIntent extends IntentService {
    public CleanUpIntent() {
        super("CleanUpIntent");
    }

    @Override
    protected void onHandleIntent(Intent arg0) {
        // clean up code
    }
}

После этого я просто запускаю уведомление, как обычно, но когда я иду, чтобы проверить его (нажав «Очистить все уведомления»), ничего не происходит. Я вставил строку кода, которая выводила что-то в LogCat при запуске IntentService, но ничего не запускалось. Это то, как я должен использовать Notification.deleteIntent?


person Brian    schedule 19.09.2011    source источник


Ответы (4)


Что вам нужно сделать, так это зарегистрировать BroadcastReceiver (возможно, в вашем AndroidManifest.xml или, альтернативно, используя registerReceiver в Service), а затем установить deleteIntent как Intent, который будет перехвачен этим получателем.

person Femi    schedule 19.09.2011
comment
Вы случайно не знаете, что такое флаг IntentFilter для перехвата, когда уведомления очищаются? - person Brian; 19.09.2011
comment
Это не флаг IntentFilter, это флаг BroadcastReceiver: см. code.google.com/p/islamictools/source/browse/trunk/IslamicTools/ для примера того, как это сделать. - person Femi; 19.09.2011
comment
Я не очень хорошо знаком с BroadcastReceivers, но мой вопрос касался того, как зарегистрировать приемник. Разве вам не нужно предоставлять ему IntentFilter независимо от того, вызываете ли вы Context.registerReceiver или вручную помещаете его в AndroidManifest? - person Brian; 19.09.2011
comment
Вы делаете. Однако, если вы зарегистрируете получателя в AndroidManifest.xml, вы можете использовать new Intent(context, {ReceiverClassName}.class) для отправки Intent в BroadcastReceiver без необходимости явной настройки IntentFilter в файле AndroidManifest.xml. Если вы используете registerReceiver, вам нужно создать IntentFilter - person Femi; 19.09.2011
comment
@Femi Ссылка на androidcompetencycenter dot com теперь является своего рода шумной ловушкой. Вы можете заменить или удалить комментарий? - person gnuf; 12.07.2016
comment
Google-код @Femi навсегда отключил SVN. Так что эта ссылка неработоспособна. - person nurettin; 24.11.2016

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

 ....
 notificationBuilder.setDeleteIntent(getDeleteIntent());
 ....


protected PendingIntent getDeleteIntent()
 {
    Intent intent = new Intent(mContext, NotificationBroadcastReceiver.class);
    intent.setAction("notification_cancelled");
    return PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
}

NotificationBroadcastReceiver.java

@Override
    public void onReceive(Context context, Intent intent)
    {
        String action = intent.getAction();
        if(action.equals("notification_cancelled"))
        {
            // your code
        }
    }

AndroidManifest.xml

 <receiver android:name=".NotificationBroadcastReceiver">
                <intent-filter>
                    <action android:name="notification_cancelled"/>
                </intent-filter>
            </receiver>
person Pawan Maheshwari    schedule 06.02.2013
comment
Абсолютно нет необходимости проверять action равенство - person Dmitry Zaytsev; 17.03.2014
comment
Приложение может иметь разные уведомления, сгенерированные одним и тем же получателем, или разные желаемые действия в зависимости от содержимого уведомления или некоторых других условий. В таких случаях может потребоваться определить действие. - person MeanderingCode; 04.10.2014
comment
Имейте в виду, что этот код повторно использует PendingIntent для всех уведомлений таким образом. Прочтите его описание о том, как генерировать необычные запросы, используя разные коды запросов или разные данные, проверенные Intent.isEqual(). - person althaus; 04.05.2017

Вы должны использовать метод getBroadcast вместо getService и должны зарегистрировать приемник для определенного действия.

person Pankaj    schedule 19.07.2012

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

person basha    schedule 24.05.2013