Home Articles

Android:清除后台堆栈

Asked
Viewed 1945 times
278

在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仍然会出现 . 我怎么能避免这种情况?

30 Answers

  • 387

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

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

  • 128

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

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

  • 71

    在清单中

    android:launchMode="singleTask"
    

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

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

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

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

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

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

  • 28

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

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

    从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

  • 14
    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.
    
  • 7

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

    在片段中,使用:

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

    在Activity中,使用(添加一个与片段相比的意图标志 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);
    
  • 7

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

    在Android清单中使用 [android:launchMode="singleTop"]Activity A 声明为 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();
    
  • 6

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

    此启动模式也可以与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
    
  • 6

    这对我来说对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();
    }
    
  • 4

    我在开始新意图后打电话给 activity_name.this.finish() ,它对我有用 .

    I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"
    

    但它对我不起作用......我不建议使用这个解决方案,但如果设置标志对你不起作用,你可以尝试这个..但我仍然建议不要使用它

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

    将此添加到您的 Activity BActivity C

    android:noHistory="true"
    

    Override onBackPressed 函数以避免用 return 反压 .

    @Override
    public void onBackPressed() {
       return;
    }
    
  • 2

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

    有关更多详细信息,请查看this文档 .

  • 2

    听起来像你需要通过使用 startActivityForResult()Activity B 开始 Activity C . 当您单击 Activity C 中的按钮时,请调用 setResult(RESULT_OK)finish() ,以便 Activity C 结束 . 在 Activity B 中,您可以通过自己调用 finish() 来响应 onActivityResult() ,然后您将被带回 Activity A .

  • 2

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

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

  • 1

    我发现了一个可能有用的有趣解决方案 . 我在 onBackPressed() 方法中做到了这一点 .

    finishAffinity();
    finish();
    

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

  • 1

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

  • 0

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

    android:noHistory="true"
    

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

  • 0
    • android:launchMode="singleTop" 添加到活动A的清单中的activity元素

    • 然后在启动活动A时使用 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

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

  • 0

    尝试使用

    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    

    并不是

    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    
  • 0

    对于将来的研究,请尝试此代码 .

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

    您可以使用此示例从 Activity C 调用 Activity A

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

  • 0

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

    在使用flag,FLAG_ACTIVITY_CLEAR_TOP启动活动A之后,我没有在后台堆栈中获得B和C.

  • 0

    在意图中添加NO History Flag .

    在活动B中,启动活动C,如下所示>>>>>>

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

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

    每次都有一个堆叠的后纵梁,但它给了我所需的控制权;


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

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

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

    MainActivity.backStack.add(this);
    

    最后,当您要清除后台堆栈时,只需致电:

    public static void killBackStack () {
        for (Activity ac : backStack) {
            if (ac != null)
                ac.finish();
        }
    }
    
  • -2
    Intent intent = new Intent(this, A.class);
    startActivity(intent);
    finish();
    
  • -26

    根据WakkaRemoving an activity from the history stack中...


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

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

Related