为什么FLAG_ACTIVITY_CLEAR_TOP不起作用?

ash*_*shu 15 android android-intent android-activity

正如标题所说,为什么intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)不会有效?

我有3个活动让我们说A,B和C.

当我尝试使用代码从C启动活动A时:

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

它只是启动活动A但不清除顶部.-_-

我也试过用setFlags().

我在这个问题上阅读了关于SO的不同问题,但我找不到正确的答案.> _ <

有人请帮忙!

编辑

@codeMagic请求的活动'A'中onBackPressed()的代码.

@Override
public void onBackPressed(){
    if(wvLogin.canGoBack())
        wvLogin.goBack();
    else
        super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

mat*_*ash 39

FLAG_ACTIVITY_CLEAR_TOP的文档:

如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为新的意图.

正如您在评论中添加的那样,活动A在呼叫B之前已经完成,因此这种情况不适用.将启动一个新的活动A实例.

在我看来,你有两个选择:

1)使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK标志.这将启动活动A作为堆栈的根.它可以工作,但堆栈中的任何其他活动都将丢失.假设A是第一个活动(或者至少,你对任务堆栈中的任何先前活动不感兴趣)那么它并不重要.注意:CLEAR_TASK需要API级别11.

2)另一种可能的解决方案(如果先前的假设不成立)将是根本不使用意图标志:

  • B从C开始startActivityForResult().
  • C没有调用A,而是设置了B的结果,表明必须启动A.
  • B.afterActivityResult(),完成B并启动A.


Rod*_*uin 6

您使用了不同的意图:使用您初始化的意图:

  Intent i = new Intent(this, A.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\WRONG;;
  startActivity(i);
Run Code Online (Sandbox Code Playgroud)

解决方案:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\RIGHT;;
Run Code Online (Sandbox Code Playgroud)

您可以将 noHistory true 设置为清单中的 Activity A

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


goo*_*ode 6

你错过了Intent.FLAG_ACTIVITY_SINGLE_TOP旗帜

尝试这个:

Intent i = new Intent(this, A.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)