Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Up to parent activity - on Android

After receiving a notification in my app, clicking on it opens activity B. Activity B has a parent activity A. Here is the manifest:

<activity
    android:name="com.evapp.activities.B"
    android:label="@string/title_activity_B"
    android:parentActivityName="com.evapp.activities.A"
    android:screenOrientation="portrait" >

    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.evapp.activities.A" />
</activity>

In activity B I have the up functionality enabled (left arrow near the activity action's bar icon), here is the code:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
    ...

The problem is that if activity B was opened via clicking on the notification (activity A was not the one to bring activity B) the when clicking on the icon the app is closed. I would like to make it open it's parent activity, A. Is it possible? or should I do it with startActivity() from activity B?

Update 1- I have added this code:

@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
   switch (item.getItemId()) 
   {
       case android.R.id.home:
            Intent upIntent = NavUtils.getParentActivityIntent(this);
            if (NavUtils.shouldUpRecreateTask(this, upIntent))
            {
                TaskStackBuilder.create(this)
                    .addNextIntentWithParentStack(upIntent)
                    .startActivities();
            } 
            else 
            {
                NavUtils.navigateUpTo(this, upIntent);
            }

            return true;

Thanks

like image 470
vlio20 Avatar asked Apr 27 '14 20:04

vlio20


2 Answers

You need to set up the PendingIntent which is used to build Notification, to start a fresh task, and provide the PendingIntent with a back stack to achieve the application's normal Up behavior.

Intent resultIntent = new Intent(this, SecondActivity.class);

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// All the parents of SecondActivity will be added to task stack.
stackBuilder.addParentStack(SecondActivity.class);
// Add a SecondActivity intent to the task stack.
stackBuilder.addNextIntent(resultIntent);

// Obtain a PendingIntent for launching the task constructed by this builder.
PendingIntent pendingIntent = stackBuilder.getPendingIntent(REQUEST_CODE, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationManager manager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification.Builder(this)
    .setContentTitle("My Notification")
    .setContentText("Notification content")
    .setSmallIcon(android.R.drawable.ic_menu_view)
    .setContentIntent(pendingIntent)
    .build();

manager.notify(NOTIFICATION_ID, notification);

Please read the Android official documentation on Preserving Navigation when Starting an Activity. It recommends the above approach.

like image 175
Manish Mulimani Avatar answered Sep 24 '22 21:09

Manish Mulimani


I use the following code and it works like a charm. Have a go!

Intent upIntent = new Intent(getApplicationContext(), Home.class);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
    Log.d("ShowNotifications", "New Home");
    TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
} else {
    Log.d("ShowNotifications", "Old Home");
    upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
    //upIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
    startActivity(upIntent);
    finish();
}
like image 42
Swayam Avatar answered Sep 21 '22 21:09

Swayam