Android:清除后台堆栈

Mar*_*tin 311 stack android clear android-intent android-activity

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

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

Intent intent = new Intent(this, B.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

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

Intent intent = new Intent(this, C.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

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

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*ile 422

尝试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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我试过这个.仍然当我再次显示C后点击后退按钮.我能错过什么? (27认同)
  • 我还添加了一个更明确的Intent intent = new Intent(SingUpActivity.this,LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(意向); 完(); (18认同)
  • 我有同样的问题,这不起作用.为我修复的是在开始新活动后调用finish() (10认同)
  • 对我来说不起作用,但是对源活动调用finish()会做我需要实现的 (7认同)
  • `intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);` (4认同)
  • @Kyle我也很挣扎,看看:http://stackoverflow.com/a/12468288/614880 (2认同)
  • @Arno谢谢!完成()做到了.没有你的小费,我永远不会想到它. (2认同)

小智 142

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

  • 完全依赖于`CLEAR_TOP`标志 - 这个组合是唯一一个完全清除整个堆栈并使新活动成为应用程序中唯一一个的组合.谢谢! (7认同)
  • 这个和被接受的答案之间的区别是什么? (6认同)
  • 谢谢,与接受的答案的区别在于,使用此标志我们不需要调用activity.finish (4认同)

Dom*_*erg 73

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

android:noHistory="true"
Run Code Online (Sandbox Code Playgroud)

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

  • 当您将控制权传递给FB以从没有历史记录的页面进行登录时,FB应用程序现在不会在登录用户后登陆,在我的情况下,它返回到手机主屏幕,我几乎失去了工作! (7认同)
  • 使用它时要非常小心 - 如果您使用FB登录或任何类似的功能 (3认同)
  • @Skynet为什么?这样做有什么问题? (2认同)

Gen*_*wen 58

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

在片段中,使用:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

在Activity中,使用(Intent.FLAG_ACTIVITY_CLEAR_TASK与片段相比再添加一个intent标志):

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);
Run Code Online (Sandbox Code Playgroud)


Jos*_*arl 28

  1. 添加android:launchMode="singleTop"到活动A的清单中的activity元素
  2. 然后在启动活动A时使用intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

这意味着当启动活动A时,将清除其上的所有任务,以便A位于顶部.在根处创建一个新的后备栈,并且使用singleTop确保您只启动一次A(因为A现在位于顶部..._CLEAR_TOP).

  • 是.这就是我现在正在使用的但是没有这样做.当我按下后退按钮时,仍然显示C. (3认同)

Dan*_*ler 26

从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

  • 提醒:这只适用于那个共享相同taskAffinity名称的活动 (3认同)

Muh*_*Ali 15

尝试使用

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Run Code Online (Sandbox Code Playgroud)

并不是

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Run Code Online (Sandbox Code Playgroud)


Jay*_*hit 9

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

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

这对我有用.在Top Top屏幕中删除所有后栈活动,

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

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


Ric*_*ier 7

根据Wakka 从历史堆栈删除活动 ...


添加android:noHistory="true"属性到你<activity>AndroidManifest.xml这样的:

    <activity android:name=".MyActivity"
        android:noHistory="true">
    </activity>
Run Code Online (Sandbox Code Playgroud)


Gee*_*etT 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();
Run Code Online (Sandbox Code Playgroud)


Pan*_*iya 7

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

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)


Fir*_*ikh 7

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.
Run Code Online (Sandbox Code Playgroud)


小智 6

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


小智 6

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

finishAffinity();
finish();
Run Code Online (Sandbox Code Playgroud)

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


Exi*_*e05 5

在 kotlin 中,它与 java 几乎相同。只有| 符号由文本替换。所以,它是这样写的——

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
Run Code Online (Sandbox Code Playgroud)


Gib*_*olt 5

高级、可重用的 Kotlin:

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

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
Run Code Online (Sandbox Code Playgroud)

如果多次使用,请创建一个 Intent 扩展函数

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
Run Code Online (Sandbox Code Playgroud)

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

intent.clearStack()
Run Code Online (Sandbox Code Playgroud)

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

fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
Run Code Online (Sandbox Code Playgroud)