Обратный вызов уведомлений Android

1

Я использую этот учебник по 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 создан для открытия нового намерения, а не для вызова функции класса, который его открыл? Есть ли способ сделать это?


EDIT: Хорошо, я узнал, как вызвать вызывающую службу из 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-адрес и заголовок, почти как с использованием другого идентификатора уведомления? Как это можно зафиксировать?

  • 0
    Ваш вопрос кажется запутанным. Вы хотите отменить AsyncTask? Можете ли вы привести пример того, что вы хотите сделать?
  • 0
    Да, я хотел бы, чтобы загрузка была отменяемой, что-то вроде загрузчика браузера по умолчанию, где вы можете нажать на него, чтобы отменить или открыть файл, если он загружен.
Теги:
notifications
android-pendingintent
android-intent

2 ответа

1
Лучший ответ

Наконец-то я узнал, почему уведомление не работает. В классе Notification, который я сделал, "нового PendingIntent" недостаточно, чтобы создать новый PendingIntent. Как описано в документации: "Если созданное приложение позже re- извлекает тот же вид 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
    И тот же самый requestCode, документация заявляет, что это для будущего использования, но на самом деле он используется для проверки на равенство. См. Code.google.com/p/android/issues/detail?id=863.
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню