问题
In Android I have some activities, let\'s say A, B, C.
In A, I use this code to open B:
Intent intent = new Intent(this, B.class);
startActivity(intent);
In B, I use this code to open C:
Intent intent = new Intent(this, C.class);
startActivity(intent);
When the user taps a button in C, I want to go back to A and clear the back stack (close both B and C). So when the user use the back button B and C will not show up, I\'ve been trying the following:
Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
But B and C are still showing up if I use the back button when I\'m back in activity A. How can I avoid this?
回答1:
Try adding FLAG_ACTIVITY_NEW_TASK as described in the docs for FLAG_ACTIVITY_CLEAR_TOP:
This launch mode can also be used to good effect in conjunction with FLAG_ACTIVITY_NEW_TASK: if used to start the root activity of a task, it will bring any currently running instance of that task to the foreground, and then clear it to its root state. This is especially useful, for example, when launching an activity from the notification manager.
So your code to launch A
would be:
Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish(); // call this to finish the current activity
回答2:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
回答3:
What about adding in manifests file for related activity :
android:noHistory="true"
to the activity definition of B and C ? They will not be added to the backstack. Not sure if that is what you want.
回答4:
This bothers me for a long time .Finally I worked it out by doing this:
In fragment,use:
Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
In Activity,use(add one more intent flag Intent.FLAG_ACTIVITY_CLEAR_TASK
compared to fragment):
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
回答5:
- Add
android:launchMode="singleTop"
to the activity element in your manifest for Activity A - Then use
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
andintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
when starting Activity A
This means that when Activity A is launched, all tasks on top of it are cleared so that A is top. A new back stack is created with A at the root, and using singleTop
ensures you only ever launch A once (since A is now on top due to ..._CLEAR_TOP
).
回答6:
Starting in API 16 (Jelly Bean), you can just call finishAffinity()
.
Now you can also call ActivityCompat.finishAffinity(Activity activity)
with the compatibility library.
Be sure to set taskAffinity in the manifest to a package name unique to that group of activities.
See for more info:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29
回答7:
Try using
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
and not
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
回答8:
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
回答9:
As per Wakka in Removing an activity from the history stack...
Add android:noHistory="true"
attribute to your <activity>
in the AndroidManifest.xml
like this:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
回答10:
For future research, try this code.
Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
回答11:
Use finishAffinity(); in task C when starting task A to clear backstack activities.
回答12:
use this code for starting new activity and close or destroy all other acivity stack or back satack...
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
回答13:
I found an interesting solution which might help. I did this in my onBackPressed()
method.
finishAffinity();
finish();
FinishAffinity
removes the connection of the existing activity to its stack. And then finish helps you exit that activity. Which will eventually exit the application.
回答14:
I found the answers here a little misleading because the code in the original question seems to work fine for me?
With A being the root activity, starting it from B or C only with FLAG_ACTIVITY_CLEAR_TOP does remove B and C from the back stack.
回答15:
Use finishAffinity() to clear all backstack with existing one.
Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C,
- Activity B will be finished / removing from stack.
- Activity A will be finished / removing from stack.
- Activity C will finished / removing from stack.
回答16:
In kotlin it is almost same like java. Only | symbol is replaced by or text. So, it is written like-
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
回答17:
I tried all solutions and none worked individually for me. My Solution is :
Declare Activity A
as SingleTop
by using [android:launchMode="singleTop"]
in Android manifest.
Now add the following flags while launching A
from anywhere. It will clear the stack.
Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();
回答18:
Intent.FLAG_ACTIVITY_CLEAR_TOP
will not work in this case. Please use (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
For more detail please check out this documentation.
回答19:
It sounds to me like you need to start Activity C
from Activity B
by using startActivityForResult()
. When you click a button in Activity C
, call setResult(RESULT_OK)
and finish()
so Activity C
is ended. In Activity B
, you could have the onActivityResult()
respond by also calling finish()
on itself, and you'd then be taken back to Activity A
.
回答20:
logout.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
回答21:
You can use this example to call your Activity A
from Activity C
Intent loout = new Intent(context, LoginActivity.class);
loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(loout);
回答22:
for me adding Intent.FLAG_ACTIVITY_CLEAR_TASK
solved the problem
Intent i = new Intent(SettingsActivity.this, StartPage.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
finish();
回答23:
In addition to FLAG_ACTIVITY_CLEAR_TOP
, you may try adding Intent.FLAG_ACTIVITY_SINGLE_TOP
as well:
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
回答24:
The given code works correctly. I have tried in the Application Life Cycle sample.
I haven't got B and C in the back stack after starting activity A with flag, FLAG_ACTIVITY_CLEAR_TOP
回答25:
i called activity_name.this.finish()
after starting new intent and it worked for me.
I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"
But it won't work for me... I am not suggesting this solution for use but if setting flag won't work for you than you can try this..But still i recommend don't use it
回答26:
Add NO History Flag in the intent.
In activity B, start the activity C as below >>>>>>
Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
finish();
回答27:
In manifest
android:launchMode="singleTask"
and
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
回答28:
Either add this to your Activity B
and Activity C
android:noHistory="true"
or Override
onBackPressed
function to avoid back pressing with a return
.
@Override
public void onBackPressed() {
return;
}
回答29:
Use setFlags() method for clear back side opened all activity close and start yourActvity
Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
回答30:
This worked for me with onBackPressed:
public void onBackPressed()
{
Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class);
Intent myIntent = new Intent(this, ImageUploadActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}
来源:https://stackoverflow.com/questions/5794506/android-clear-the-back-stack