Android:如何从状态栏通知创建的PendingIntent访问AsyncTask?

Shi*_*ino 6 android status android-asynctask android-notification-bar android-pendingintent

我的应用程序启动AsyncTask,从URL下载文件.同时,它会创建一个状态栏Notification,告诉用户完成下载的百分比.

我正在尝试让我的应用程序响应单击通知.如果下载仍在进行中,我想显示一个DialogInterface询问他们是否要停止下载的内容.单击是应该停止下载.

我遇到的问题是我不确定如何从PendingIntent我为通知设置的异步任务中访问我的异步任务.我可以DialogInterface很容易地显示,但我不确定如何显示下载停止它的活动.

我尝试创建一个可以访问通知的Helper类以及引用可下载文件的File对象,但是我得到一个错误,说该对象不可序列化(它实现了Serializable).帮助程序类还包括一个成员,它将保存下载的进度,这是我将用于是否显示对话框的条件.

我正在考虑使用Brodcast Action和接收器,但我不确定将接收器放在哪里.它会延伸到延伸的类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
    }

}
}
Run Code Online (Sandbox Code Playgroud)

所以要清楚,我有一ViewDetailActivity堂课.它有一个内部类DownloadFile,AsyncTask在用户单击屏幕上的按钮时会扩展并执行.在该doInBackground()方法中DownloadFile,从URL开始下载mp3,Notification并且基于下载的文件的量创建和更新状态栏.该PendingIntentNotification与创建DownloadNotificationActivity(代码所示),并应该显示哪些,"是"被选择时,应该取消下载的对话框AsyncTask.

我的问题是我需要回复DownloadFile下载已被取消的任务,我不知道如何DownloadFile从中DownloadNotificationActivity取消它以取消它.

提前致谢!

Mot*_*tes 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;
Run Code Online (Sandbox Code Playgroud)

然后在你的 main 中Activity创建AsyncTask类似的内容:

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

然后,当您创建通知并想要取消异步任务时,只需将其引用为 zeTask 即可。MyAsyncTask 需要与通知位于同一活动中,并且 zeTask 可以是保存对 AsyncTask 的引用的变量。

switch ( which ) {
                case DialogInterface.BUTTON_POSITIVE :
                    zeTask.cancel();
                    finish();
                    break;
Run Code Online (Sandbox Code Playgroud)