Android getIntent() returns the first intent
Solution 1
@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
Solution 2
/**
* 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.
}
Solution 3
actually you just need create PendingIntent with PendingIntent.FLAG_UPDATE_CURRENT ,like this:
mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Solution 4
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.
Bopanna
Updated on June 13, 2022Comments
-
Bopanna almost 2 years
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 theAsyncTask
. So here I update the progress using theonProgressUpdate()
method where in I use theNotificationManager
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
andNOTIFICATION_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
insideOpenDownloadedVideo
returns the firstIntent
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.
-
Bopanna almost 12 yearshow do i do that ?? sorry Im quite new to this.
-
Alexander Kulyakhtin almost 12 yearsI don't know if it will help or not. In manifest editor you add SINGLE_TOP for your Activity launch mode. Then you override your Activity's onNewIntent() and put the same code in there as you have in onCreate
-
Bopanna almost 12 yearsI have made the
OpenDownloadedVideo
activitySINGLE_TOP
and inside the activity i have overriden theonNewIntent
as well as you suggested.... But when the activity is launched or re-launched it doesn't seem to go inside theonNewIntent
method. -
Alexander Kulyakhtin almost 12 years@Bopanna Perhaps it's not relaunched but paused and then resumed?
-
DoruChidean over 8 yearsalso, to retrieve the new intent you have to override onNewIntent(), calling getIntent() will return the old one even if you use setIntent()
-
welshk91 about 8 yearsThis is a great answer. I needed to basically use setIntent or call the super method for onNewIntent() to make sure getIntent returned the latest intent.