Daniel Rotnemer
Daniel Rotnemer

Reputation: 105

How to prevent activity from reloading itself when coming back after visiting other activities?

I have 5 different activities in my app, i enable the user to navigate between those activities by clicking buttons. The main activity has a RecyclerView in it (used to make a feed). the other activities are used for search, profile, notifications, etc. The user opens the app, the main activity is displayed. The user can scroll through the feed (which is the RecyclerView) in the main activity, now the user decides to go to other activities, search, profile, etc. Now, when the user clicks on the button that navigates to the main activity, I want to open back the main activity and display the recycler view at the same scrolling position and with the same items as was when the user just left it off.

Note: I'm not talking here about pressing the back button or using any goBack functions. I want to enable the user to use the main activity and visit all other activities and after all of that he will be able to come back to the main activity and find the feed exactly as he left it off.

In every activity I have five navigation buttons that allowing the user to go from every activity to every activity: click on profileBtn will open the profile activity, etc.

There is a way in which i can back up the state of the recycler view in the main activity before the user wants to go to other activities and restore it when the user clicks on the homeBtn?

Code:

HomeActivity.java:

public void profileBtn_OnClick(android.view.View view)
{
    Intent intent = new Intent(getBaseContext(), ProfileActivity.class);
    startActivity(intent);
}

ProfileActivity.java, SerachActivity.java, NotificationsActivity.java:

public void homeBtn_OnClick(android.view.View view)
{
    /* HERE I WANT TO OPEN BACK THE HOME ACTIVITY AND DISPLAY THE FEED
       EXACTLY AS IT WAS WHEN THE USER LEFT IT, HOW DO I DO THAT? */

    Intent intent = new Intent(getBaseContext(), HomeActivity.class);
    startActivity(intent);
}

Upvotes: 0

Views: 682

Answers (2)

David Wasser
David Wasser

Reputation: 95578

Please do NOT use the special launch mode singleTask for this purpose. It causes more problems than it solves. These launch modes have complex side-effects that are not obvious and will cause you more problems later.

Your problem is simple to solve using standard Android behaviour. Change your method to look like this:

public void homeBtn_OnClick(android.view.View view)
{
    Intent intent = new Intent(getBaseContext(), HomeActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
}

The flag CLEAR_TOP tells Android to remove all activities from the task that are on top of the target Activity (in this case the target Activity is HomeActivity.

The flag SINGLE_TOP tells Android not to recreate HomeActivity, but to reuse the existing instance of it.

Upvotes: 1

Aman Kumar
Aman Kumar

Reputation: 254

You can use the launchMode="singleTask".

The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to the existing instance through a call to its onNewIntent() method, rather than creating a new one.

You can get more information about launchMode here: https://developer.android.com/guide/topics/manifest/activity-element

android:launchMode=["standard" | "singleTop" | "singleTask" | "singleInstance"]

<activity
     android:name=".ui.HomeActivity"
     android:launchMode="singleTask" />

Upvotes: 1

Related Questions