Android:清除后堆栈

Android:清除后堆栈,android,android-intent,android-activity,stack,Android,Android Intent,Android Activity,Stack,在安卓系统中,我有一些活动,比如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时不会显示,我一直在尝试以下操作:

在安卓系统中,我有一些活动,比如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仍然会出现。我如何避免这种情况?

我觉得您需要使用
startActivityForResult()
活动B
开始
活动C
。单击
活动C
中的按钮时,调用
setResult(RESULT\u OK)
finish()
以结束
活动C
。在
活动B
中,您可以让
onActivityResult()
通过调用自身的
finish()
来响应,然后您将返回到
活动A

尝试按照文档中所述添加:

此启动模式也可用于 配合使用效果好 标记活动新任务:如果用于 启动任务的根活动,它 将带来任何当前正在运行的 将该任务的实例添加到 前景,然后将其清除到当前位置 根状态。这特别有用,, 例如,在启动 通知中的活动 经理

因此,启动
A
的代码是:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
CurrentActivity.this.finish(); // if the activity running has it's own context


// view.getContext().finish() for fragments etc.

除了
FLAG\u ACTIVITY\u CLEAR\u TOP
,您还可以尝试添加
Intent。FLAG\u ACTIVITY\u SINGLE\u TOP

intent.addFlags(intent.FLAG\u ACTIVITY\u SINGLE\u TOP)
intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP)

  • android:launchMode=“singleTop”
    添加到活动A清单中的活动元素中
  • 然后使用
    intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP)
    intent.addFlags(intent.FLAG\u ACTIVITY\u NEW\u TASK)
    启动活动A时

  • 这意味着,当启动活动A时,它上面的所有任务都将被清除,以便A位于顶部。在根目录下创建一个新的后堆栈,并使用
    singleTop
    确保您只启动一次(因为
    …\u CLEAR\u top
    现在A位于顶部)。

    为相关活动添加清单文件怎么样:

    android:noHistory="true"
    

    B和C的活动定义?它们不会添加到后台。不确定这是否是您想要的。

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

    当A是根活动时,仅使用标志“活动”从B或C开始,清除“顶部”会将B和C从后堆栈中移除。

    根据

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

    android:noHistory=“true”
    属性添加到
    AndroidManifest.xml中的
    ,如下所示:

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

    给定的代码工作正常。我在应用程序生命周期示例中进行了尝试

    在使用flag、flag\u activity\u CLEAR\u TOP启动活动A后,我的后堆栈中没有B和C

    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    
    而不是

    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    
    从API 16(Jelly Bean)开始,您只需调用
    finishafinity()

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

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

    有关更多信息,请参阅:

    注销.添加标志(意图.标志\u活动\u清除\u任务);
    logout.addFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK)

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

    在fragment中,使用:

    Intent intent = new Intent(view.getContext(), A.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent);
    
    在活动中,使用(与片段相比,再添加一个意图标志
    intent.flag\u Activity\u CLEAR\u TASK
    ):


    在启动新的intent之后,我调用了
    activity\u name.this.finish()
    ,它对我有效

    I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"
    

    但这对我不起作用。。。我不建议使用此解决方案,但如果设置标志对您不起作用,您可以尝试使用此解决方案。但我仍然建议不要使用此解决方案进行未来研究,请尝试此代码

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

    在意图中不添加历史标记

    在活动B中,按如下方式启动活动C>>>>>>>

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

    Intent.FLAG\u ACTIVITY\u CLEAR\u TOP
    在这种情况下不起作用。请使用
    (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)


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

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

    完成此活动以及当前任务中紧靠其下方具有相同关联性的所有活动

    这是我的工作 在顶部付款屏幕中,删除所有后台活动

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

    我尝试了所有的解决方案,但没有一个单独对我有效。 我的解决办法是:

    在android清单中使用
    [android:launchMode=“SingleTop”]
    将活动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();
    

    您可以使用此示例从
    活动C
    调用您的
    活动A

    Intent loout=newintent(上下文、LoginActivity.class);
    loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    背景。起始触觉(loout)

    android:launchMode="singleTask"
    


    使用finishefinity();启动任务A时在任务C中清除后台活动。

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

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

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

    finishAffinity();
    finish();
    

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

    在kotlin中,它与jav几乎相同
    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);
    
    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.
    
    finishAffinity();
    finish();
    
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
    
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
          val intent = Intent(this@LoginActivity, MainActivity::class.java)
          intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
          startActivity(intent)
          finish()
    
    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();
    
    intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
    
    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
    }