multiholle multiholle - 19 days ago 5
Android Question

Android activity navigation save state

In the main activity

ActivityA
I replace
FragmentA
by fragment
FragmentB
. From
FragmentB
the user can start a new activity
ActivityB
. By hitting the back button in
ActivityB
,
ActivityA
is displayed showing
FragmentA
. I was expecting to see
FragmentB
with its last state. Do I have to save the state of the previous activities separately to provide this behaviour?

ActivityA(FragmentA) -> ActivityA(FragmentB) -> ActivityB
BACK
ActivityA(FragmentB)


In the main activity I set the current fragment using:

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.a_main_frame_content, new FragmentB())
.addToBackStack(null)
.commit();


From the fragment I start a new activity using:

Intent intent = new Intent(getActivity(), ActivityB.class);
getActivity().startActivity(intent);


ActivityA
is set as parent activity for
ActivityB
to provide proper navigation.

[UPDTATE] It looks like the problem lies in the different behaviour of navigating back and navigating up. If I navigate back, the activity is displayed in its last state while navigating up forces the activity to recreate.

Answer

Lets try this:

In the intent of the parentActivity(if you can set it before you create parentActivity its best, otherwise you may have to use setIntent):

    currentActivityIntent.putExtra("random-unique-key-for-each-activity",
random-unique-key-for-each-activity);

And before you create a child activity, u put following in a map:

myKeyIntentMap.put(random-unique-key-for-each-activity, currentActivityIntent);

In the method triggered on "Up" event :

{
String parentKey = currentActivity.parentActivity.getIntent.getStringExtra("random-unique-key-for-each-activity");
Intent intentToLaunch = (Intent)myKeyIntentMap.get(parentKey);
intentToLaunch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP );
startActivity(intentToLaunch);
}

This way, using the intent, even if your History Stack is A-someAct1-someAct2-B, and u launch intent resolving to A, it will be "brought to front" killing someActs.

P.S. I havent done any null checks and havent kept in mind the exact method names, just given you an approach.

Comments