Android - Build a notification, TaskStackBuilder.addParentStack not working

AndroidNotifications

Android Problem Overview


I'm trying to launch an activity from a notification like the Android docs explain, but when I open the notification and then press the back button, the HomeActivity (parent) doesn't open, instead the application closes. What am I doing wrong?

    Intent resultIntent = new Intent(context, MatchActivity.class);;
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    
    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(MainActivity.class);
    
    stackBuilder.addNextIntent(resultIntent);

Android Solutions


Solution 1 - Android

You need to add the parent stack for the activity you're launching, not the parent of it.

Replace:

stackBuilder.addParentStack(MainActivity.class);

with:

stackBuilder.addParentStack( MatchActivity.class );

This assumes that you've defined the parent in your Manifest (API 16+):

<activity android:name=".MatchActivity"
    android:parentActivityName=".MainActivity"
    ... />

If you're developing for under API 16, then you have to define the parent as:

<activity android:name=".MatchActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>

Solution 2 - Android

If none of the solutions are working and you are sure that you have followed everything carefully...then you need you uninstall the app and reinstall it. Worked for me!

Solution 3 - Android

Intent resultIntent = new Intent(App.getContext(), TargetActivity.class);
Intent backIntent = new Intent(App.getContext(), ParentActivity.class);
backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
final PendingIntent resultPendingIntent = PendingIntent.getActivities(
                                    App.getContext(), 0, 
               new Intent[]{backIntent, resultIntent}, PendingIntent.FLAG_ONE_SHOT);
mNotifyBuilder.setContentIntent(resultPendingIntent);

this solved my problem with Parent stack on Notification Click

Solution 4 - Android

Using TaskStackBuilder didn't solve my problem and works only for Honeycomb and greater. So I take the following solution (please, don't crucify me):

  1. Call MainActivity instead of MatchActivity, passing MatchActivity as argument (by Intent).
  2. In MainActivity.onCreate, start the MatchActivity if the parameter is available.

New code:

Intent resultIntent = new Intent(context, MainActivity.class) //
        .putExtra(MainActivity.ACTIVITY_EXTRA, MatchActivity.class.getName()) //
        .putExtra("Pass extras to MatchActivity", "if you want! :)");

PendingIntent pendingIntent = PendingIntent.getActivity(context, visitId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification notification = new NotificationCompat.Builder(context) //
			.setContentIntent(pendingIntent) //
			.build();

On MainActivity:

public static final String ACTIVITY_EXTRA = "activity";

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	if (getIntent().getStringExtra(ACTIVITY_EXTRA) != null) {
		startActivity(new Intent(getIntent()).setClassName(this, getIntent().getStringExtra(ACTIVITY_EXTRA)));
	}
    ...
}

Solution 5 - Android

For me the stackBuilder.addParentStack didn't work.

I end up doing this, hope this could helps you.

    Intent intent = new Intent(context, MatchActivity.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    // Adds the back stack for the Intent
    stackBuilder.addNextIntentWithParentStack(new Intent(context, MainActivity.class));
    stackBuilder.addNextIntent(intent);
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

Solution 6 - Android

Have you looked in the Android documentation, specifically the Notifications API guide. It describes how to do this in detail.

Notice that if the Activity you start from the notification is not part of the normal Activity flow, then it should not go to the start page of the app; instead, it should go to the Home screen.

Solution 7 - Android

You should add this to the MainActivity on the AndroidManifest:

<activity
   android:name=".MainActivity"
   android:allowTaskReparenting="true" />

Solution 8 - Android

As stated in other answers, TaskStackBuilder doesn't work for versions below Honeycomb.

My solution was to override the activity's onBackPressed() method.

@Override
public void onBackPressed() {
	NavUtils.navigateUpFromSameTask(this);
}

Obviously if you're planning on finishing the activity in some other manner you will have to handle that as well. (Though I imagine overriding finish() will have some unexpected behaviour).

Solution 9 - Android

I had the same problem! Solve:

switch to

PendingIntent resultPendingIntent = 

PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent resultPendingIntent = 

stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

Solution 10 - Android

If you use code generation in your project (like Dagger) the MainActivity.class should be replaced with the MainActivity_.class (or whatever your parent activity name is). Took me a whole day to figure this out. Hope this can save someone's day.

Solution 11 - Android

also this can happen if your activiti in mannifest has next launchMode:

<activity android:name=".SecondActivity"
     ...
         android:launchMode="singleInstance"
         android:parentActivityName=".MainActiviy"
    ...
/>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavid FortunatoView Question on Stackoverflow
Solution 1 - AndroidKhantahrView Answer on Stackoverflow
Solution 2 - AndroidpenduDevView Answer on Stackoverflow
Solution 3 - AndroidRafaelView Answer on Stackoverflow
Solution 4 - AndroidItalo BorssattoView Answer on Stackoverflow
Solution 5 - AndroidPabloView Answer on Stackoverflow
Solution 6 - AndroidJoe MalinView Answer on Stackoverflow
Solution 7 - AndroidRafa0809View Answer on Stackoverflow
Solution 8 - AndroidkassimView Answer on Stackoverflow
Solution 9 - AndroidJoelderView Answer on Stackoverflow
Solution 10 - AndroidMykolaView Answer on Stackoverflow
Solution 11 - AndroidAndriy AntonovView Answer on Stackoverflow