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 が作成されているようです。これを行う方法はありますか?


編集:わかりました、保留中の意図から呼び出し元のサービスを呼び出す方法を見つけました:

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);

実行中のサービスは常に 1 つだけであるため、DownloadService にはすべての AsyncTask の ArrayList があり、onStart はそれらの 1 つが同じ URL とタイトルを持っているかどうかを確認し、同じ場合は AsyncTask のメソッドを呼び出して実行中の項目をキャンセルするか、アクションを実行します。完成品について。

ArrayList のカウントは新しい DownloaderTasks の ID として送信されるため、それぞれに通知を作成するための一意の ID がありますが、ステータス ドロップダウンで通知を選択すると、間違った URL で DownloadService が呼び出されることがあることに気付きました。とタイトルは、別の通知の ID を使用しているようなものですか? これはどのように修正できますか?

4

2 に答える 2

1

通知が機能しない理由がようやくわかりました。私が作成した Notification クラスでは、「new PendingIntent」だけでは新しい PendingIntent を作成できません。ドキュメントで説明されているように、「作成中のアプリケーションが後で同じ種類の PendingIntent (同じ操作、同じインテント アクション、データ、カテゴリ、およびコンポーネント、および同じフラグ) を再取得する場合、同じトークンを表す 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);
于 2011-06-13T17:27:49.400 に答える
0

cancel(boolean)AsyncTaskの実行をキャンセルしようとするメソッドを参照してください。

タスクのキャンセル:

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

于 2011-05-31T20:40:10.247 に答える