Search code examples
androidandroid-activitynotificationsandroid-pendingintent

Set different activities for pending intent of notification


I am currently facing the problem of setting pending action for two different activities to notification.

I have a ParentActivity and a ChildActivity. I want open ChildActivity on notification click if currently it is running or paused, otherwise start ParentActivity.

I tried this :

 .........

    Intent resultIntent = new Intent(this, ChildActivity.class);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(ParentActivity.class);
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    .............

Above is not working for me. Everytime ChildActivity is starting on notification click.

And also as Faruk answered, I dont want this. Creating a notification's pending intent by checking ChildActivity's current state will not work. Suppose notification created when ChildActivity was running but after creating the notification, user killed the app. So after killing the app, If user will click on notification then ChildActivity will start. I don't want that. I want if ChildActivity is not running or paused then ParentActivity should be started.

How can I achieve this? Please help.


Solution

  • Have your Notification launch a simple dispatch Activity. This Activity does the following in onCreate():

    super.onCreate(...);
    if (ChildActivity.running) {
        // ChildActivity is running, so redirect to it
        Intent childIntent = new Intent(this, ChildActivity.class);
        // Add necessary flags, maybe FLAG_ACTIVITY_CLEAR_TOP, it depends what the rest of your app looks like
        childIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(childIntent);
    } else {
        // Child is not running, so redirect to parent
        Intent parentIntent = new Intent(this, ParentIntent.class);
        // Add necessary flags, maybe FLAG_ACTIVITY_CLEAR_TOP, it depends what the rest of your app looks like
        parentIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(parentIntent);
    }
    finish();
    

    In ChildActivity do this:

    public static boolean running; // Set when this Activity is active
    

    In ChildActivity.onCreate() add this:

    running = true;
    

    In ChildActivity.onDestroy() add this:

    running = false;