【问题标题】:Android: How do I access an AsyncTask from a PendingIntent created by a status bar notification?Android:如何从状态栏通知创建的 PendingIntent 访问 AsyncTask?
【发布时间】:2012-06-12 17:27:43
【问题描述】:

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

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

我遇到的问题是我不确定如何从我为通知设置的PendingIntent 访问我的异步任务。我可以让DialogInterface 显示足够简单,但我不确定如何显示正在停止下载的活动。

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

我正在考虑使用 Brodcast Action 和接收器,但我不确定将接收器放在哪里。它会进入扩展AsyncTask 的类吗?

任何帮助将不胜感激。 这是附加到NotificationPendingIntent。如果您想查看更多代码,请询问。

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 的内部类,它扩展了AsyncTask,并在用户单击屏幕上的按钮时执行。在DownloadFiledoInBackground() 方法中,从URL 开始下载mp3,并根据下载的文件量创建和更新状态栏NotificationNotificationPendingIntent 是用DownloadNotificationActivity 创建的(代码所示),它应该显示一个对话框,选择“是”,应该取消AsyncTask 中的下载。

我的问题是我需要回复DownloadFile 任务已取消下载,但我不确定如何从DownloadNotificationActivity 访问DownloadFile 才能取消它。

提前致谢!

【问题讨论】:

    标签: android android-asynctask status android-notification-bar android-pendingintent


    【解决方案1】:

    在您的asynctask 中,您需要检查doInBackground() 中的isCancelled() 并在取消时中止。根据您的通知,您可以通过asynctask 拨打cancel()

    为此,您需要将对 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;
    

    【讨论】:

    • 这就是我遇到的问题实际上是将AsyncTask 的引用传递给上面的活动。我试图在AsyncTask 上实现Serializable 并在Intent 上使用putExtra() 我设置为PendingIntent,但我得到一个异常,说该对象不可序列化。还有其他方法可以将对 AsyncTask 的引用传递给我的活动吗?
    • 好的,我认为我这样做的方式行不通。我发布的通知任务仅在单击状态栏通知时用作PendingIntentAsyncTask 实际上是在处理屏幕的类中,您可以单击以下载文件。听起来我需要将我的AsyncTask 移动到DownloadNotificationActivity 并在该类的onCreate 中执行它。然后处理通知的onClick 事件。我会让你知道会发生什么。
    • 尝试我在之前的评论中所说的没有奏效。我感谢您的帮助@Motes。我已经用更多信息更新了这个主题(在底部)。我觉得我正在以错误的方式解决这个问题。我需要寻找其他选择。我考虑过尝试BroadcastBraodcastReceiver,但我不确定将接收器放在AsyncTask 上会有多大效果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多