Android通知回调

时间:2011-05-31 19:30:28

标签: android notifications android-intent android-pendingintent

我在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?如何解决这个问题?

2 个答案:

答案 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