Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 851
multiholle Avatar asked Feb 13 '23 22:02

multiholle


1 Answers

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.

like image 188
con_9 Avatar answered Feb 16 '23 10:02

con_9