10

我开发了一个应用程序来下载视频文件并将其存储在 SD 卡中。在此过程中,我还将下载的进度和状态更新为状态栏通知,使用NotificationManager.

我的班级称为DownloadTask.java扩展了AsyncTask. onProgressUpdate()所以在这里我使用我为此目的使用的方法更新进度NotificationManager。一切都像一个魅力,除了下载完成后我想点击通知打开特定的视频文件。所以这就是我所做的:

mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

int icon = android.R.drawable.stat_sys_download_done;
long when = System.currentTimeMillis();

mNotification = new Notification(icon, "", when);
mContentTitle_complete = mContext.getString(R.string.download_complete);
notificationIntent = new Intent(mContext,OpenDownloadedVideo.class);
notificationIntent.putExtra("fileName", file);
mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0);
mNotification.setLatestEventInfo(mContext, file, mContentTitle_complete, mContentIntent);
mNotification.flags = Notification.FLAG_AUTO_CANCEL;
mNotificationManager.notify(NOTIFICATION_ID, mNotification);

请注意,fileNameandNOTIFICATION_ID在我的情况下是唯一的。

通过以下Activity OpenDownloadedVideo.java方式打开文件:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {  
        fileName = getIntent().getExtras().getString("fileName");
        Intent i = new Intent(Intent.ACTION_VIEW);
        File videoFileToPlay = new File(Environment.getExternalStorageDirectory()+"/MyFolder"+"/"+fileName);
        i.setDataAndType(Uri.fromFile(videoFileToPlay), "video/*");
        startActivity(i);
        finish();
    } catch(Exception e) {
        //
    }
}

因此,当我第一次下载视频并单击通知时,将打开相应的视频文件。但是,下次我下载另一个视频时,单击通知,下载的第一个文件将再次打开。

这是因为getIntentinsideOpenDownloadedVideo返回第一个Intent创建的而不是最新的。我该如何纠正?

另外,请注意,当我下载多个视频时会出现问题场景,例如,如果我下载了五个不同的视频文件并且状态栏中有五个通知。每次单击通知时都会打开相同的文件。

4

6 回答 6

12
/**
 * Override super.onNewIntent() so that calls to getIntent() will return the
 * latest intent that was used to start this Activity rather than the first
 * intent.
 */
@Override
public void onNewIntent(Intent intent){
    super.onNewIntent(intent); // Propagate.
    setIntent(intent); // Passing the new intent to setIntent() means this new intent will be the one returned whenever getIntent() is called.
}
于 2014-10-30T12:23:00.280 回答
11

实际上,您只需要使用 PendingIntent.FLAG_UPDATE_CURRENT 创建 PendingIntent 如下所示:

mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
于 2013-05-22T00:32:01.107 回答
9

来自Android Activity.onNewIntent() 文档

请注意,getIntent() 仍然返回原始 Intent。您可以使用 setIntent(Intent) 将其更新为这个新的 Intent。

所以当你得到新的 Intent 时,你需要将它显式设置为 Activity Intent。

于 2012-08-24T11:31:11.877 回答
5

@Alex 和 @Codinguser,感谢您的回复。非常感激。但是,我找到了一个对我有用的不同答案。PendingIntent在为传递创建Intent一个唯一值时。就我而言,我正在这样做:

mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0); 

但现在我正在使用NOTIFICATION_ID它,因为它是独一无二的。我已将上述调用更改为:

mContentIntent = PendingIntent.getActivity(mContext, NOTIFICATION_ID,
                                           notificationIntent, 0);

就是这样,它有效。

我在待处理意图的多个实例中找到了一些关于它的信息

于 2012-08-29T09:08:11.083 回答
0

如果您将OpenDownloadedVideo活动设为 SINGLE_TOP 并覆盖onNewIntent怎么办?

于 2012-08-24T10:58:13.147 回答
0

在您打算启动的活动中。添加(覆盖)以下函数:

@Override
protected void onNewIntent(final Intent intent) {
        super.onNewIntent(intent);
        this.setIntent(intent);
}
于 2019-03-11T17:42:28.080 回答