6

私のアプリケーションはAsyncTask、URL からファイルをダウンロードする を開始します。同時に、Notificationダウンロードの完了率をユーザーに知らせるステータス バーを作成します。

通知のクリックにアプリケーションが応答するようにしようとしています。ダウンロードがまだ進行中のDialogInterface場合は、ダウンロードを停止するかどうかを尋ねるメッセージを表示したいと思います。[はい] をクリックすると、ダウンロードが停止します。

私が抱えている問題はPendingIntent、通知用に設定した から非同期タスクにアクセスする方法がわからないことです。をDialogInterface簡単に表示することはできますが、ダウンロードが停止する場所で停止しているアクティビティを表示する方法がわかりません。

ダウンロード可能なファイルを参照する File オブジェクトだけでなく、通知にもアクセスできるヘルパー クラスを作成しようとしましたが、オブジェクトがシリアライズ可能ではないというエラーが表示されます (それは を実装していますSerializable)。ヘルパー クラスには、ダイアログを表示するかどうかの条件に使用する、ダウンロードの進行状況を保持するメンバーも含まれていました。

Brodcast アクションと受信機を使おうと思っていたのですが、受信機をどこに置けばいいのかわかりません。を拡張するクラスに入るでしょうAsyncTaskか?

どんな助けでも大歓迎です。これは にPendingIntent付属していNotificationます。もっとコードを見たい場合は、質問してください。

public class DownloadNotificationActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate( Bundle savedInstanceState ) {
    super.onCreate( savedInstanceState );

    Intent i = getIntent();

    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {

        @Override
        public void onClick( DialogInterface dialog, int which ) {
            switch ( which ) {
                case DialogInterface.BUTTON_POSITIVE :
                    // Yes button clicked
                    // Stop download
                    finish();
                    break;

                case DialogInterface.BUTTON_NEGATIVE :
                    // No button clicked
                    finish();
                    break;
            }
        }
    };

    if ( /* download not complete */ ) {
        AlertDialog.Builder builder = new AlertDialog.Builder( this );
        builder.setMessage( R.string.stop_download ).
                setPositiveButton( R.string.yes, dialogClickListener ).
                setNegativeButton( R.string.no, dialogClickListener ).show();
    }
    else {
        // Access file
    }

}
}

明確にするために、私にはViewDetailActivityクラスがあります。ユーザーが画面上のボタンをクリックすると、DownloadFile拡張されて実行されるという内部クラスがあります。AsyncTaskdoInBackground()方法でDownloadFileは、mp3 のダウンロードが URL から開始され、ステータス バーNotificationが作成され、ダウンロードされたファイルの量に基づいて更新されます。のPendingIntentは(コードを表示)Notificationで作成されDownloadNotificationActivity、[はい] を選択すると、 でのダウンロードをキャンセルするダイアログが表示されますAsyncTask

私の問題は、ダウンロードがキャンセルされたことをタスクに戻す必要があることです。ダウンロードをキャンセルするためにからDownloadFileにアクセスする方法がわかりません。DownloadFileDownloadNotificationActivity

前もって感謝します!

4

1 に答える 1

1

では、をチェックして、キャンセルした場合は中止asynctaskする必要があります。通知から、 を呼び出します。isCancelled()doInBackground()cancel()asynctask

これを行うには、への参照をAsyncTask通知アクティビティに渡す必要があります。

例えば:

次のように AsyncTask を作成します。

class MyAsyncTask extends AsyncTask<Void, Integer, Void> {
        @Override
        protected Void doInBackground(Void... unused) { //be sure to check isCancelled here, i.e. if (isCancelled()) break;

次に、メインで次のようなものActivityを作成します。AsyncTask

public class MyActivity extends Activity {
    private MyAsyncTask zeTask;
    @Override
    public void onCreate(Bundle savedInstanceState) {
              zeTask= new MyAsyncTask();
              zeTask.execute();

次に、通知を作成して非同期タスクをキャンセルしたい場合は、それを zeTask として参照します。MyAsyncTask は通知と同じアクティビティにある必要があり、zeTask は AsyncTask への参照を保持する変数にすることができます。

switch ( which ) {
                case DialogInterface.BUTTON_POSITIVE :
                    zeTask.cancel();
                    finish();
                    break;
于 2012-06-12T18:55:05.847 に答える