Android Notification PendingIntent Extras null

24,085

Solution 1

I just got the answer, add line: resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

NOTICE: if you add it as resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); It won't work.

I also tried other flags like, "FLAG_ACTIVITY_NEW_TASK" and "FLAG_ACTIVITY_RESET_TASK_IF_NEEDED". neither works here.

Solution 2

in PendingIntent use this flag PendingIntent.FLAG_UPDATE_CURRENT it's work for me

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Solution 3

For me, in addition to setting Intent.FLAG_ACTIVITY_SINGLE_TOP , I had to add a unique action to the intent:

    Intent resultIntent = new Intent(caller, NotificationActivity.class);

    String xId = getNextUniqueId();
    resultIntent.putExtra("x_id", xId);
    resultIntent.setAction(xId);
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

.. without the setAction(..), Extras is null on the Intent received by my NotificationActivity.

This post helps explain it: https://stackoverflow.com/a/3128271/2162226

Solution 4

When an activity is launched(when it is first started ) or relaunched(when it's brought to the top of the stack) the getIntent().getExtra() won't give null. But when the activity is present on the top of the stack then on starting that activity with the use of PendingIntent would not relaunch the activity(onCreate() won't get called) instead onResume() would be called. And getIntent().getExtra() would return the value which is associated with the intent that started the activity(which is null).
In order to update the intent do the following steps:

1). Set FLAG_ACTIVITY_SINGLE_TOP and FLAG_ACTIVITY_CLEAR_TOP flags in your intent.

resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

2). Override onNewIntent() in the activity where getIntent().getExtra() is called. This method is called by FLAG_ACTIVITY_SINGLE_TOP

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

For more info: See this doc

Solution 5

For me, my Samsung device kept removing the extras from the intent and sometimes even crashed the app. Tried all the combinations but the actual reason for this behaviour was not explicitly adding PendingIntent.FLAG_IMMUTABLE flag to the pending intent.

Although, this is a requirement for Android 12 and above.

val pendingIntent = PendingIntent.getActivity(
                                this, 0,
                                getIntent(),
PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE
                            )
Share:
24,085
antonio081014
Author by

antonio081014

I am a mobile developer.

Updated on February 16, 2022

Comments

  • antonio081014
    antonio081014 over 2 years

    I am trying to send information from notification to invoked activity, while from my activity I got null.

    The code for notification is:

    private void showNotification() {
    Intent resultIntent = new Intent(this, MainActivity.class);
    if (D)
        Log.d(TAG, "Id: " + Id);
    resultIntent.putExtra("ineedid", deviceId);
    
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(MeterActivity.class);
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
        PendingIntent.FLAG_UPDATE_CURRENT);
    // Bundle tmp = resultIntent.getExtras();
    // if (tmp == null) {
    // Log.d(TAG, "tmp bundle is null");
    // } else {
    // long id = tmp.getLong("ineedid", -1);
    // Log.d(TAG, "tmp id : " + id);
    // }
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
        BLEMessengerService.this)
        .setSmallIcon(R.drawable.ic_action_search)
        .setContentTitle("Event tracker")
        .setContentText("Events received").setOngoing(true)
        .setContentIntent(resultPendingIntent)
        .setWhen(System.currentTimeMillis());
    
    int mId = R.string.service_notification_start_service;
    mNM.notify(mId, mBuilder.getNotification());
    }
    

    Code for get information from intent in main activity;

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        long deviceID = getIntent().getLongExtra("ineedid",
            -1);
        if (ID == -1) {
        if (D)
            Log.i(TAG_D, "Wrong Id received.");
        finish();
        } else {
        device = dataSource.getDeviceByID(deviceID);
        if (D)
            Log.i(TAG_D, "Get the id.");
        }
    } else {
        if (D)
        Log.d(TAG_D, "Bundle is null");
        finish();
    }
    

    I have verified before the notification get notified, bundle is not null, and it has id in extras. While, when I tried to fetch it from intent, it's gone. Help.

    • antonio081014
      antonio081014 over 11 years
      I also tried to add "resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);", but no work.
    • PearsonArtPhoto
      PearsonArtPhoto over 11 years
      There a reason you aren't using resultPendingIntent.getExtras()?
    • antonio081014
      antonio081014 over 11 years
      I just made those lines to check if my pendingIntent has Extras, and I verified it has what I put there.
    • Reejesh PK
      Reejesh PK over 5 years
      If you are working with FCM, usually the notification is handled by android itself,and hence, your Notification, when clicked does not have extras. For More Info, refer:stackoverflow.com/questions/37358462/…
  • mparaz
    mparaz about 11 years
    I was trying the same thing. Any clue in the documentation why this flag is needed? It just says "If set, the activity will not be launched if it is already running at the top of the history stack."
  • Arthur
    Arthur about 5 years
    Clear and correct explanation, this should be the accepted answer
  • cainy393
    cainy393 about 4 years
    One of my intents had one extra (a boolean) but another was missing. Specifying an action of any kind fixes it and suddenly both extras are now present! Thanks.
  • elnezah
    elnezah almost 4 years
    Excellent! This is the right answer, and comes with a free straightforward explanation. 👍 I'd like to add some more info: in my case, I got one additional problem: the intent persists after first call, meaning that on subsequents app resumes, the behavior programmed repeats because the Intent is still the same. To avoid it, I added in onResume a getIntent().removeExtra("the_no-more-desired_extra") in the right strategical spot.
  • User9211
    User9211 about 3 years
    Works! Thanks!!
  • user5646514
    user5646514 almost 3 years
    If you were only going to use it once at a time, you can use this. But if you need multiple PendingIntents to be valid concurrently, and FLAG_UPDATE_CURRENT would leave you with only the most recent intent as valid. Possible solution is intent.flag_activity_new_task
  • Ankit Wala
    Ankit Wala almost 2 years
    this really helped, same thing was happening with me , all serialised extras were getting removed and after adding this flag, it worked like a charm