Bopanna
Bopanna

Reputation: 95

Android getIntent() returns the first intent

I have developed an application to download a video file and store it in the SD card. In the process I also update the progress and status of the download as a status bar notification using the NotificationManager.

My class called the DownloadTask.java extends the AsyncTask. So here I update the progress using the onProgressUpdate() method where in I use the NotificationManager for the purpose. Everything works like a charm except, on completion of download I want to click the notification to open the specific video file. So this is what i have done:

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);

Note that the fileName and NOTIFICATION_ID are unique in my case.

The Activity OpenDownloadedVideo.java opens the file by:

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) {
        //
    }
}

So when I download a video for the first time and click on the notification the appropriate video file will be opened. However next time when I download another video, and click on the notification the first file which was downloaded will be opened again.

This is because getIntent inside OpenDownloadedVideo returns the first Intent created and not the latest. How can I correct this?

Also, please note that the problem scenario exists when I download more than one video, e.g. if I download five different video files and there are five notifications in the status bar. The same file will be opened each time a notification is clicked.

Upvotes: 10

Views: 12034

Answers (6)

Elad
Elad

Reputation: 1655

in the activity you're intent is launching. Add (override) the following function:

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

Upvotes: 0

Boycott A.I.
Boycott A.I.

Reputation: 18871

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

Upvotes: 12

Royer
Royer

Reputation: 172

actually you just need create PendingIntent with PendingIntent.FLAG_UPDATE_CURRENT ,like this:

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

Upvotes: 11

Bopanna
Bopanna

Reputation: 95

@Alex and @Codinguser, thank you for your replies. Much appreciated. However I found a different answer that worked for me. When creating a PendingIntent for the Intent pass a unique value to it. In my case I was doing this:

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

but now I'm using NOTIFICATION_ID since it was unique. I've changed the above call to:

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

That's all and it works.

I found some information on it in the question Mulitple Instances of Pending Intent

Upvotes: 5

codinguser
codinguser

Reputation: 5572

From the Android Activity.onNewIntent() documentation

Note that getIntent() still returns the original Intent. You can use setIntent(Intent) to update it to this new Intent.

So when you get the new Intent, you need to explicitly set it as the activity intent.

Upvotes: 9

Alexander
Alexander

Reputation: 48252

What if you make your OpenDownloadedVideo activity SINGLE_TOP and override onNewIntent?

Upvotes: 0

Related Questions