Android:清除后台堆栈

时间:2011-04-26 18:03:12

标签: android android-intent android-activity stack clear

在Android中我有一些活动,比方说A,B,C。

在A中,我使用此代码打开B:

Intent intent = new Intent(this, B.class);
startActivity(intent);

在B中,我使用此代码打开C:

Intent intent = new Intent(this, C.class);
startActivity(intent);

当用户点击C中的按钮时,我想返回A并清除后栈(关闭B和C)。因此,当用户使用后退按钮时B和C将不会显示,我一直在尝试以下内容:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

但是当我回到活动A时,如果我使用后退按钮,B和C仍然会出现。我怎么能避免这种情况?

38 个答案:

答案 0 :(得分:399)

尝试按照FLAG_ACTIVITY_NEW_TASK的文档中所述添加FLAG_ACTIVITY_CLEAR_TOP

  

此启动模式也可用于   结合良好的效果   FLAG_ACTIVITY_NEW_TASK:如果习惯的话   它启动任务的根活动   会带来任何正在运行的   该任务的实例   前景,然后清除它   根状态。这特别有用,   例如,启动时   来自通知的活动   管理器。

因此,启动A的代码将是:

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

答案 1 :(得分:137)

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

答案 2 :(得分:73)

如何为相关活动添加清单文件:

android:noHistory="true"

到B和C的活动定义?它们不会被添加到Backstack中。不确定这是不是你想要的。

答案 3 :(得分:55)

这困扰了我很长一段时间。最后我通过这样做来解决这个问题:

在片段中,使用:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

在“活动”中,使用(与片段相比再添加一个意图标记Intent.FLAG_ACTIVITY_CLEAR_TASK):

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);

答案 4 :(得分:28)

  1. android:launchMode="singleTop"添加到活动A
  2. 的清单中的activity元素
  3. 然后使用intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)和 启动活动A时intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  4. 这意味着当启动活动A时,将清除其上的所有任务,以便A位于顶部。在根目录下创建一个新的后台堆栈,并使用singleTop确保您只启动一次A(因为A现在由于..._CLEAR_TOP而位于顶部)。

答案 5 :(得分:25)

从API 16(Jelly Bean)开始,您只需拨打finishAffinity()

现在,您还可以使用兼容性库调用ActivityCompat.finishAffinity(Activity activity)

确保将清单中的taskAffinity设置为该活动组唯一的包名称。

有关详情,请参阅:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29

答案 6 :(得分:14)

尝试使用

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

而不是

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

答案 7 :(得分:9)

如果您的应用程序具有最低版本16的sdk,那么您可以使用  的 finishAffinity()

完成此活动以及当前任务中具有相同亲缘关系的紧接其下的所有活动。

这对我有用 在“最高支付”屏幕中,删除所有后筹码活动,

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

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

答案 8 :(得分:7)

根据Wakka中的Removing an activity from the history stack ...


android:noHistory="true"属性添加到<activity>中的AndroidManifest.xml,如下所示:

    <activity android:name=".MyActivity"
        android:noHistory="true">
    </activity>

答案 9 :(得分:7)

对于未来的研究,请尝试此代码。

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();

答案 10 :(得分:6)

使用finishAffinity();在任务C中启动任务A以清除后台堆叠活动。

答案 11 :(得分:4)

使用此代码启动新活动并关闭或销毁所有其他活动堆栈或返回satack ...

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

答案 12 :(得分:3)

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.

答案 13 :(得分:3)

我发现这里的答案有点误导,因为原始问题中的代码似乎对我有用吗?

如果A是根活动,仅使用FLAG_ACTIVITY_CLEAR_TOP从B或C启动它会从后堆栈中删除B和C.

答案 14 :(得分:3)

在kotlin中,它几乎与Java相同。仅 | 符号被文本替换。 因此,它的写法是-

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

答案 15 :(得分:2)

我找到了一个有趣的解决方案,可能会有所帮助。我是通过onBackPressed()方法做到的。

finishAffinity();
finish();

FinishAffinity删除现有活动与其堆栈的连接。然后完成操作可以帮助您退出该活动。最终将退出应用程序。

答案 16 :(得分:2)

Intent.FLAG_ACTIVITY_CLEAR_TOP在这种情况下不起作用。请使用(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

有关详细信息,请查看this文档。

答案 17 :(得分:2)

听起来我需要使用Activity CActivity B开始startActivityForResult()。当您点击Activity C中的按钮时,请致电setResult(RESULT_OK)finish(),以便结束Activity C。在Activity B中,您可以通过onActivityResult()自行调用finish()来回复,然后您将被带回Activity A

答案 18 :(得分:2)

我尝试了所有解决方案,没有人为我单独工作。 我的解决方案是:

在Android清单中使用Activity ASingleTop声明为[android:launchMode="singleTop"]

现在从任何地方启动A时添加以下标志。它将清除堆栈。

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();

答案 19 :(得分:1)

高级可重复使用的Kotlin:

您可以使用setter方法直接设置标志。在Kotlin中,or是Java的replacement按位或|

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

如果多次使用,请创建一个Intent扩展功能

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

然后您可以在启动意图之前直接调用此函数

intent.clearStack()

如果需要在其他情况下添加其他标志的选项,请向扩展功能添加可选参数。

fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

答案 20 :(得分:1)

您可以使用此示例从Activity A

致电Activity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);

答案 21 :(得分:1)

对我来说,添加Intent.FLAG_ACTIVITY_CLEAR_TASK可以解决问题

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();

答案 22 :(得分:1)

logout.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);                             logout.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

答案 23 :(得分:0)

Kotlin示例:

      val intent = Intent(this@LoginActivity, MainActivity::class.java)
      intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
      startActivity(intent)
      finish()

答案 24 :(得分:0)

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

答案 25 :(得分:0)

这是我解决问题的方法:

private boolean clearHistoryBackStack = true;

@Override
public final void finish() {
    super.finish();

    if(clearHistoryBackStack)
        finishAffinity();
}

答案 26 :(得分:0)

此代码在Kotlin中对我有用:

 val intent = Intent(this, MainActivity::class.java)
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
 startActivity(intent)
 finish()

答案 27 :(得分:0)

在那之后,您将没有任何活动可以通过按返回按钮:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | 
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finishAffinity();
finish();

答案 28 :(得分:0)

这对我有用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();
}

答案 29 :(得分:0)

使用setFlags()方法清除背面打开所有活动关闭并启动 yourActvity

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

答案 30 :(得分:0)

在清单

android:launchMode="singleTask"

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

答案 31 :(得分:0)

将此添加到您的Activity BActivity C

android:noHistory="true"

Override onBackPressed功能可以避免使用return进行反击。

@Override
public void onBackPressed() {
   return;
}

答案 32 :(得分:0)

在意图中添加无历史记录标记。

在活动B中,按以下方式启动活动C&gt;&gt;&gt;&gt;&gt;&gt;

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

答案 33 :(得分:0)

我在启动新意图后调用了activity_name.this.finish(),它对我有用。

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

但它对我不起作用......我不是建议使用这个解决方案,但如果设置标志对你不起作用,那么你可以试试这个......但是我仍然建议不要这样做。&#39 ;使用它

答案 34 :(得分:0)

除了FLAG_ACTIVITY_CLEAR_TOP之外,您还可以尝试添加Intent.FLAG_ACTIVITY_SINGLE_TOP

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

答案 35 :(得分:0)

给定的代码正常工作。我已尝试过Application Life Cycle样本。

在启动带有标志的活动A后,我没有在后台堆栈中获得B和C,FLAG_ACTIVITY_CLEAR_TOP

答案 36 :(得分:-2)

这是一个非常古老的答案,我没有真正找到适当的解决方案,为了清除backStack的唯一目的,我决定创建我自己的backstack,这甚至不是堆栈tbh,但它没有不得不这样,因为我们想要清除其中的所有内容;

每次都有一个背驮式的后腿,但它给了我所需的控制权;

首先声明一个公共静态活动列表(或片段,无论你需要什么);

-i

在所有其他活动的onCreate方法中:

public static ArrayList <Activity> backStack = new ArrayList<>();

最后,当你想要清除后台时,只需致电:

MainActivity.backStack.add(this);

答案 37 :(得分:-26)

Intent intent = new Intent(this, A.class);
startActivity(intent);
finish();