mstfdz
mstfdz

Reputation: 2796

how to finish all activities except the first activity?

I google it but even if i run this code below it didnt finish the other activities.

ButtonClick.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            LoginManager.getInstance().ctrl = false;
            UserManager.getInstance().loginControl();
            OrderManager.getInstance().orderCtrl = false;
            Intent intent = new Intent(OrderComplete.this,
                    MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            startActivity(intent);
            finish();
        }
    });
}

Upvotes: 34

Views: 26020

Answers (9)

Kimmi Dhingra
Kimmi Dhingra

Reputation: 2289

To clear top activities from stack use below code

Intent intents = new Intent(A.this, B.class);
intents.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_CLEAR_TOP
            | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intents);
finish();

It will delete all activities from stack either asynctask run or not in the application.

It works fine and also a good approach

Upvotes: 31

Tarsem Singh
Tarsem Singh

Reputation: 14199

UPDATE Please refer to the other answers, I cannot delete the answer because it is marked as accepted

As per Our Discussion in Comments

Your Given Code is Fine !

Q1. Why its Not Finishing All the Activities ?

Ans. I think All Activities Are Finished Except Activities who have Thread or AysncTask running in Background or not Finished yet!

Q2. How Can i Finish Them ?

Ans. Make Sure your Thread Should be Finished ! or You can Try Timeout etc !


Additional

Pass String with Your Intent 

for this Add Code

intent.putExtra("finishingallact", "yes");

Inside First Activity (Which is not to be Finished)

Try by Making Object of Remaining Activities to Finish Them !

So Try code :

if(getIntent().getStringExtra("finishingallact")!=null)
{
 if(getIntent().getStringExtra("finishingallact").toLowerCase().equals("yes"))
  {
    yourRemainingAct act1=new yourRemainingAct();
    act1.finish();
    // Try Same For ALl Remaining Activities 
  }
}

Upvotes: 8

A-Droid Tech
A-Droid Tech

Reputation: 2321

We can Use :

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
  startActivity(i);

Upvotes: 3

Avnish Choudhary
Avnish Choudhary

Reputation: 838

To remove all the Activities while opening new one, then do the following

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

Upvotes: 5

Pankaj Arora
Pankaj Arora

Reputation: 10274

just remove every activity from stack except your first activity

youractivity.this.finish();

or you can use the Activity Single top. for that you can use:

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

Upvotes: 6

Kimmi Dhingra
Kimmi Dhingra

Reputation: 2289

1.If we haven't the asynctask class or thread in our class then by simply

i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

write this code,can easily remove all activities from stack

2.this can also be done by making launcher activity as single task this can be done by changes in manifest file. as

android:launchMode="singleTask" 

3.But if we have asynctask in our app and also use of thread then both above methods fail..

for that we have to finish activity one by one

for eg. We have four activities A,B,C,D and each class has async task

and we have to go from A -> B-> C-> D

and from D We have again come back to *"A" and after pressing back button of device the app should be finish or can say exit*

For that we have to make static object of activities of all classes. Like

 **In class A**
     public static Avtivity mactivity;
     @Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_third);
            mactivity=this;
             }

Do this in all classes B,C

And then in D

By pressing a button finish the objects of all classes Like

**mButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) 
        {
            B mB=new B();
            mB.mactivity.finish();
                   //////do this for all class which are present in stack of activities
                            finish();
                            ////this will finish the D class and we reach at A class
                    }
                  });**

Thats solve...

I know its not a gud way but also not a bad one...And main thing is its working :)

Upvotes: 0

Biraj Zalavadia
Biraj Zalavadia

Reputation: 28484

Try this it works fine with me

// clear whole activity stack

    Intent intent = new Intent("clearStackActivity");
    intent.setType("text/plain");
    sendBroadcast(intent);

// start your new activity
Intent intent = new Intent(OrderComplete.this,
                    MainActivity.class);
startActivity(intent);

UPDATE

sorry I forget to give these lines. Put these line in onCreate() method of all Activities or if you have any base activity you can put it there , then no need to put in all activities.

private KillReceiver clearActivityStack;
clearActivityStack = new KillReceiver();
        registerReceiver(clearActivityStack, IntentFilter.create("clearStackActivity", "text/plain"));

UPDATE

So sorry forget one more thing to give put this class in your Base activity

private final class KillReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            finish();
        }
    }

Upvotes: 6

Avijit
Avijit

Reputation: 3824

when your going from one activity to other activity call finish();

do like this

public void onClick(View v) {
  Intent i = new Intent(A.this,B.class);

  i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
  startActivity(i);
  finish(); // to end the current activity
 }

call finish() after startactivity(...), so that A activity ll removed from the stack. when you press back button A activity ll be not there in stack.

Upvotes: 10

Muhammad Aamir Ali
Muhammad Aamir Ali

Reputation: 21087

remove android:lanchMode="singleTop" from menifest and use setFlag intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Upvotes: 0

Related Questions