Android getIntent()返回第一个intent

时间:2012-08-24 10:45:52

标签: android android-intent notifications android-activity

我开发了一个应用程序来下载视频文件并将其存储在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);

请注意,fileNameNOTIFICATION_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) {
        //
    }
}

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

这是因为getIntent内的OpenDownloadedVideo会返回创建的第一个Intent而不是最新的{{1}}。我怎么能纠正这个?

此外,请注意,当我下载多个视频时存在问题情况,例如:如果我下载五个不同的视频文件,状态栏中有五个通知。每次点击通知时都会打开相同的文件。

6 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:8)

来自Android Activity.onNewIntent() documentation

  

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

因此,当您获得新的Intent时,您需要将其明确设置为活动意图。

答案 2 :(得分:6)

/**
 * 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.
}

答案 3 :(得分:5)

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

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

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

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

这就是全部而且有效。

我在问题中找到了一些相关信息 Mulitple Instances of Pending Intent

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您要启动的活动中。 添加(覆盖)以下功能:

@Override
protected void onNewIntent(final Intent intent) {
        super.onNewIntent(intent);
        this.setIntent(intent);
}