我在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具有其所有AsyncTasks的ArrayList,并且onStart检查其中一个是否具有相同的url和title,如果是,则调用AsyncTask的方法来取消运行的项目或对已完成的项目采取行动。
ArrayList的计数作为新的DownloaderTasks的id发送,因此每个人都有一个唯一的id来创建它的通知,但我注意到有时当我在状态下拉列表中选择一个通知时,它会调用DownloadService错误的网址和标题,几乎就像是在使用其他通知的ID?如何解决这个问题?
答案 0 :(得分:1)
我终于找到了通知无效的原因。在我制作的Notification类中,“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);
答案 1 :(得分:0)
请参阅尝试取消执行AsyncTask的cancel(boolean)
方法。
取消任务:
https://developer.android.com/reference/android/os/AsyncTask.html