Обратный вызов уведомлений Android - PullRequest
1 голос
/ 31 мая 2011

Я использую этот учебник по AsyncTask с задачей и уведомлением: https://eliasbland.wordpress.com/2011/03/11/an-example-of-how-to-run-a-background-task-and-report-progress-in-the-status-bar-using-asynctask-on-android/

Что меня смущает, так это то, как сделать так, чтобы обратный вызов сделал что-то в исходном классе, из которого он был вызван.Оптимально было бы здорово иметь что-то вроде:

private class DownloaderTask extends AsyncTask {
    doInBackground() { ... download the file ... }

    onProgressUpdate, onPreExecute, etc. from the example, managing a notification.

    notificationClicked() {
        if (success) {
          //show file
        } else {
          cancel(true);
        }
}

однако, кажется, PendingIntent создан для открытия нового намерения, а не для вызова функции в классе, который его открыл?Есть ли способ сделать это?


РЕДАКТИРОВАТЬ: Хорошо, я узнал, как вызвать вызывающую службу из pendingintent:

Intent returnIntent = new Intent(_context,DownloadService.class);
returnIntent.putExtra("url", _url);
returnIntent.putExtra("name",_title);
notificationIntent = PendingIntent.getService(_context, 0, returnIntent, 0);
notification.setLatestEventInfo(_context, _title, _url, notificationIntent);

Поскольку всегда работает только одна служба, DownloadService имеет ArrayList всех своих AsyncTasks, и onStart проверяет, имеет ли один из них одинаковые URL и заголовок, если это так, он вызывает метод AsyncTask для отмены запущенного элемента или выполнения действия над завершенным элементом.

Счетчик ArrayList отправляется как идентификатор новых задач DownloaderTasks, поэтому каждый из них будет иметь уникальный идентификатор для создания своего уведомления, но я заметил, что иногда, когда я выбираю уведомление в раскрывающемся списке состояний, он вызывает DownloadService снеправильный URL и заголовок, почти как если бы он использовал идентификатор другого уведомления?Как это можно исправить?

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Я наконец нашел, почему уведомление не работает.В классе уведомлений, который я создал, «new PendingIntent» недостаточно для создания нового PendingIntent.Как описано в документации: «Если приложение для создания позже повторно извлекает того же типа PendingIntent ( та же операция, то же действие Intent, данные, категории и компоненты, и те же флаги ), он получит PendingIntent, представляющий тот же токен, если он все еще действителен, и, таким образом, может вызвать метод cancel (), чтобы удалить его. "Также требуется FLAG_CANCEL_CURRENT, поскольку он может кэшироваться из предыдущего запуска.

Этот код работает:

Intent returnIntent = new Intent(_context,DownloadService.class);
returnIntent.putExtra("url", _url);
returnIntent.putExtra("name",_title);
returnIntent.putExtra("notifClick",true);
returnIntent.setAction("test.test.myAction"+_NOTIFICATION_ID);
// Important to make a unique action name, and FLAG_CANCEL_CURRENT, to make separate notifications.

notificationIntent = PendingIntent.getService(_context, 0, returnIntent, PendingIntent.FLAG_CANCEL_CURRENT);
0 голосов
/ 01 июня 2011

См. cancel(boolean) метод, который пытается отменить выполнение AsyncTask.

Отмена задания:

https://developer.android.com/reference/android/os/AsyncTask.html

...