在Android上处理活动堆栈的最佳方法

在Android上处理活动堆栈的最佳方法,android,android-activity,Android,Android Activity,我有一个特殊的场景,没有找到解决方案。 我将我的活动堆栈设置为A->B->C->D。从D开始,当使用按钮完成时,我想启动活动A并清除堆栈,这是我通过启动活动A实现的,并带有标志\u activity\u clear\u TOP。 现在问题来了: 我的活动B也可以从其他应用程序可以触发的意图启动。在这种情况下,一旦用户处于活动D,我启动活动A并使用标志“活动”\u CLEAR\u TOP,活动D仍然保留在后堆栈中,因为活动A不在堆栈中。 有人能指出如何处理这种情况吗 提前感谢。为什么不使用FLAG

我有一个特殊的场景,没有找到解决方案。 我将我的活动堆栈设置为A->B->C->D。从D开始,当使用按钮完成时,我想启动活动A并清除堆栈,这是我通过启动活动A实现的,并带有标志\u activity\u clear\u TOP。 现在问题来了: 我的活动B也可以从其他应用程序可以触发的意图启动。在这种情况下,一旦用户处于活动D,我启动活动A并使用标志“活动”\u CLEAR\u TOP,活动D仍然保留在后堆栈中,因为活动A不在堆栈中。 有人能指出如何处理这种情况吗


提前感谢。

为什么不使用FLAG\u Activity\u CLEAR\u TOP调用活动A,然后完成()活动D?

阅读一次,您将永远不会遇到使用FLAG\u Activity\u CLEAR\u TOP的问题

下面是一个关于Flag\u Activity\u Clear\u Top用法的简单说明

正确使用的一种衬里配方:

它总是清除调用活动和被调用活动之间的中间活动(如果有)

以下是一个活动流程:

活动A->活动B->活动C(使用活动清除顶部标记转到D)->活动D

在上面的序列中,当到达D时,如果按back键,我们将得到Activity C->Activity B->Activity A,因为Activity C和Activity D之间没有中间活动

这里有些开发者的神话是-

在使用C中的标志activity clear top到达活动D后,他们希望在按下D中的后退键时将他们带到应用程序之外,这是永远不会发生的

标记\活动\清除\顶部始终清除两个活动之间的中间活动(如果有)

您可以通过使用
广播接收器

  • 创建一个
    BaseActivity
    ,如下所示:


  • 使您的活动扩展到
    BaseActivity
  • 无论何时要清除堆栈:



活动D或活动B仍在堆栈中?使用clear top并启动活动后,请使用finish();也这将解决你的问题。@JaiKumar,但在这种情况下,B和C将留在后台,所以这不会解决问题this@agomov因此,如果我的应用程序是从B开始并打算从B开始,我的后堆栈将是B->C->D。在D上按Done之后,我只想要一个A@manan否。如果使用clear_top,则以前的活动将从堆栈中清除。只有启动clear top的活动保留在堆栈中,如果使用finish();整个堆栈将为空。这与注释中的jaiKumar解决方案相同。但在这种情况下,B和C将保留在backbackback中,因此不会解决此问题。B和C将不在堆栈中,因为我们执行活动\u CLEAR\u TOP。正如文档所说,“如果设置了,并且正在启动的活动已经在当前任务中运行,则不启动该活动的新实例,而是关闭其上的所有其他活动,并将此意图作为新意图传递给(现在位于顶部)旧活动。”或者您可以使用“标记活动\清除\任务”这将清除整个堆栈。注意“如果已设置,则正在启动的活动已在当前任务中运行”。在我的情况下,A不在当前任务中,堆栈是B->C->D,我想要的是启动A并清除所有内容,在这种情况下,A上没有任何内容,所以clear\u top将不起任何作用,使用“FLAG\u ACTIVITY\u clear\u task”。最初你发布了A->B->C-D。这给人一种印象,A是更早发布的。我完全理解这一点,这就是为什么我更正了另外两张海报。。广播解决方案是好的,但我希望,它可能比这个解决方案更容易清除堆栈。。。谢谢
public class BaseActivity extends Activity {
    private KillReceiver mKillReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mKillReceiver = new KillReceiver();
        registerReceiver(mKillReceiver,
            IntentFilter.create("kill", "spartan!!!"));
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mKillReceiver);
    }
    private final class KillReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            finish();
        }
    }
}
Intent intent = new Intent("kill");
intent.setType("spartan!!!");
sendBroadcast(intent);