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