Finish all previous activities

JavaAndroidAndroid ActivityScreen

Java Problem Overview


My application has the following flow screens :

Home->screen 1->screen 2->screen 3->screen 4->screen 5

Now I have a common log out button in each screens

(Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)

I want that when user clicks on the log out button(from any screen), all the screens will be finished and a new screen Log in will open .

I have tried nearly all FLAG_ACTIVITY to achieve this. I also go through some answers in stackoverflow, but not being able to solve the problem. My application is on Android 1.6 so not being able to use FLAG_ACTIVITY_CLEAR_TASK

Is there any way to solve the issue ?

Java Solutions


Solution 1 - Java

Use:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

This will clear all the activities on top of home.

Assuming you are finishing the login screen when the user logs in and home is created and afterward all the screens from 1 to 5 on top of that one. The code I posted will return you to home screen finishing all the other activities. You can add an extra in the intent and read that in the home screen activity and finish it also (maybe launch login screen again from there or something).

I am not sure but you can also try going to login with this flag. I don't know how the activities will be ordered in that case. So don't know if it will clear the ones below the screen you are on including the one you are currently on but it's definitely the way to go.

Solution 2 - Java

You may try Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK. It will totally clears all previous activity(s) and start new activity.

Solution 3 - Java

Before launching your new Activity, simply add the following code:

finishAffinity();

Or if you want it to work in previous versions of Android:

ActivityCompat.finishAffinity(this);

Solution 4 - Java

When the user wishes to exit all open activities, they should press a button which loads the first Activity that runs when your application starts, clear all the other activities, then have the last remaining activity finish. Have the following code run when the user presses the exit button. In my case, LoginActivity is the first activity in my program to run.

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

The above code clears all the activities except for LoginActivity. Then put the following code inside the LoginActivity's onCreate(...), to listen for when LoginActivity is recreated and the 'EXIT' signal was passed:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

Why is making an exit button in Android so hard?

Android tries hard to discourage you from having an "exit" button in your application, because they want the user to never care about whether or not the programs they use are running in the background or not.

The Android OS developers want your program to be able to survive an unexpected shutdown and power off of the phone, and when the user restarts the program, they pick up right where they left off. So the user can receive a phone call while they use your application, and open maps which requires your application to be freed for more resources.

When the user resumes your application, they pick up right where they left off with no interruption. This exit button is usurping power from the activity manager, potentially causing problems with the automatically managed android program life cycle.

Solution 5 - Java

I guess I am late but there is simple and short answer. There is a finishAffinity() method in Activity that will finish the current activity and all parent activities, but it works only in Android 4.1 or higher.

For API 16+, use

finishAffinity();

For below 16, use

ActivityCompat.finishAffinity(YourActivity.this);

Hope it helps!

Solution 6 - Java

Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

This Will work for all Android versions. Where IntentCompat the class added in Android Support library.

Solution 7 - Java

Use the following for activity

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

remove CLEAR_TASK flag for fragment use.

I hope this may use for some people.

Solution 8 - Java

On a side note, good to know
This answer works (https://stackoverflow.com/a/13468685/7034327)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();

whereas this doesn't work

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() replaces any previous flags and doesn't append any new flags while .addFlags() does.

So this will also work

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Solution 9 - Java

From developer.android.com:

> public void finishAffinity () > Added in API level 16

Finish this activity as well as all activities immediately below it in the current task that have the same affinity. This is typically used when an application can be launched on to another task (such as from an ACTION_VIEW of a content type it understands) and the user has used the up navigation to switch out of the current task and in to its own task. In this case, if the user has navigated down into any other activities of the second application, all of those should be removed from the original task as part of the task switch.

Note that this finish does not allow you to deliver results to the previous activity, and an exception will be thrown if you are trying to do so.

Solution 10 - Java

If your application has minimum sdk version 16 then you can use finishAffinity()

Finish this activity as well as all activities immediately below it in the current task that have the same affinity.

This is work for me In Top Payment screen remove all back-stack activits,

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

Solution 11 - Java

In my case I use finishAffinity() function in last activity like:

finishAffinity()
startHomeActivity()

Hope it'll be useful.

Solution 12 - Java

A solution I implemented for this (I think I found it on Stack Overflow somewhere, but I don't remember, so thanks to whoever did that in the first place):

From any of your activities do this:

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Then in your LoginActivity, overwrite onKeyDown:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Solution 13 - Java

For logout button on last screen of app, use this code on logout button listener to finish all open previous activities, and your problem is solved.

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}

Solution 14 - Java

i have same problem you can use IntentCompat , like this :

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

this code work for me .

Android api 17

Solution 15 - Java

    Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

Solution 16 - Java

instead of using finish() just use finishAffinity();

Solution 17 - Java

Log in->Home->screen 1->screen 2->screen 3->screen 4->screen 5

on screen 4 (or any other) ->

StartActivity(Log in)
with
FLAG_ACTIVITY_CLEAR_TOP

Solution 18 - Java

for API >= 15 to API 23 simple solution.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

Solution 19 - Java

If you are using startActivityForResult() in your previous activities, just override OnActivityResult() and call the finish(); method inside it in all activities.. This will do the job...

Solution 20 - Java

When user click on the logout button then write the following code:

Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

And also when after login if you call new activity do not use finish();

Solution 21 - Java

I guess I am late but there is simple and short answer. There is a finishAffinity() method in Activity that will finish the current activity and all parent activities, but it works only in Android 4.1 or higher.

For API 16+, use

finishAffinity();

For below 16, use

ActivityCompat.finishAffinity(YourActivity.this);

Hope it helps!

shareedit answered May 27 '18 at 8:03

Akshay Taru

Solution 22 - Java

Simply, when you go from the login screen, not when finishing the login screen.

And then in all forward activities, use this for logout:

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

It works perfectly.

Solution 23 - Java

If you log in the user in screen 1 and from there you go to the other screens, use

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Solution 24 - Java

I found this way, it'll clear all history and exit

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);

Solution 25 - Java

I found this solution to work on every device despite API level (even for < 11)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

Solution 26 - Java

Best way to close all the previous activities and clear the memory

finishAffinity()
System.exit(0);

Solution 27 - Java

I have tried the flags on my end and still haven't worked. I have an application with a very similar design and I have a possible solution in terms of logic. I have built my Login and Logout using shared preferences.

If I logout, data in my shared preferences is destroyed/deleted.

From any of my activities such as Home.java I check whether shared preferences has data and in this case it won't because I destroyed it when I logged out from one of the screens. Therefore logic destroys/finishes that activity and takes me back to the Login activity. You can replicate this logic in all your other activities.

However remember to perform this check inside onPostResume() because this is what is called when you go back to Home.java

Code Sample Below:

@Override
protected void onPostResume() {
    SharedPreferences pref = this.getSharedPreferences("user_details", Context.MODE_PRIVATE);
    if (pref.getAll().isEmpty()){
        //Shared Preferences has no data.
        //The data has been deleted
        Intent intent = new Intent(getApplicationContext(), Login.class);
        startActivity(intent);
        finish();
        //Finish destroys that activity which in our case is the Home.java
    }


    super.onPostResume();
}

Solution 28 - Java

In Kotlin this way:

in Another Activity (with some classes), under Imports

var activity:Activity?=null
    get() = field
    set(value) {
        field = value
    }

Then, under onCreate

activity=this

in MainActivity now:

activity?.finish()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTanmay MandalView Question on Stackoverflow
Solution 1 - JavaDArkOView Answer on Stackoverflow
Solution 2 - JavaKong KenView Answer on Stackoverflow
Solution 3 - JavaHenriqueView Answer on Stackoverflow
Solution 4 - JavaEric LeschinskiView Answer on Stackoverflow
Solution 5 - JavaAkshayTView Answer on Stackoverflow
Solution 6 - JavaGemView Answer on Stackoverflow
Solution 7 - JavaAristo MichaelView Answer on Stackoverflow
Solution 8 - JavaJohnView Answer on Stackoverflow
Solution 9 - JavagmrlView Answer on Stackoverflow
Solution 10 - JavaJaydeep purohitView Answer on Stackoverflow
Solution 11 - JavaDjek-GrifView Answer on Stackoverflow
Solution 12 - JavaAndyView Answer on Stackoverflow
Solution 13 - JavaAmritView Answer on Stackoverflow
Solution 14 - JavaAdnan Abdollah ZakiView Answer on Stackoverflow
Solution 15 - JavaPrashant KumarView Answer on Stackoverflow
Solution 16 - JavaHitesh KushwahView Answer on Stackoverflow
Solution 17 - JavaPlamen NikolovView Answer on Stackoverflow
Solution 18 - JavaKamal BunkarView Answer on Stackoverflow
Solution 19 - JavangeshView Answer on Stackoverflow
Solution 20 - JavanikkiView Answer on Stackoverflow
Solution 21 - JavaSamuel QuirozView Answer on Stackoverflow
Solution 22 - JavaAsad RaoView Answer on Stackoverflow
Solution 23 - JavaGabriel NegutView Answer on Stackoverflow
Solution 24 - Javapirooz jenabiView Answer on Stackoverflow
Solution 25 - JavapriyankvexView Answer on Stackoverflow
Solution 26 - JavaShivam TripathiView Answer on Stackoverflow
Solution 27 - JavaMosesKView Answer on Stackoverflow
Solution 28 - JavaMoriView Answer on Stackoverflow