Android 从堆栈中弹出已知数量的活动

Android 从堆栈中弹出已知数量的活动,android,android-activity,activity-stack,Android,Android Activity,Activity Stack,在构建应用程序的过程中,我有一个活动,我们称之为A,我会多次打开,如A(1)->A(2)->A(3)->…->A(m)->…->A(n) 在我想一路弹出到A(m)的应用程序中,有没有办法将活动一路弹出到所选活动 我已经看到了一些答案,但在我看来,这只是清除整个堆栈并转到堆栈中的第一个元素,这不是我想要得到的 更新: 我在这里试图实现的是:我有一个问题列表,用户可以为每个问题选择不同的答案 一旦他选择了,问题和答案就会进入历史列表,并提示另一个问题。在任何给定点,用户都可以单击历史按钮并返回到他选

在构建应用程序的过程中,我有一个活动,我们称之为A,我会多次打开,如A(1)->A(2)->A(3)->…->A(m)->…->A(n)

在我想一路弹出到A(m)的应用程序中,有没有办法将活动一路弹出到所选活动

我已经看到了一些答案,但在我看来,这只是清除整个堆栈并转到堆栈中的第一个元素,这不是我想要得到的

更新:

我在这里试图实现的是:我有一个问题列表,用户可以为每个问题选择不同的答案

一旦他选择了,问题和答案就会进入历史列表,并提示另一个问题。在任何给定点,用户都可以单击历史按钮并返回到他选择的问题


所有的问答活动都是相同的,因此返回到一个问题意味着弹出堆栈,直到到达那里。

作为一个一般性的回答,我会说继续弹出,直到pop返回的活动是您想要的,然后可能会将其推回(如果需要).

如果我理解正确,您是说您有N个相同的活动,并且希望返回堆栈中的任意起始点活动

我不完全清楚您是否提前知道您的“粘性”活动之前的所有活动都应该完成,或者这是否是在过程中确定的

我不知道当N个活动是重复的活动时,有什么任意的方法可以从堆栈中弹出N个活动,但是您可以滚动自己的活动,例如(未完成的代码)

如果您提前知道A(M)在启动下一个活动之前将是粘性的,您可以通过向每个前向活动传递一个标志,告诉它在启动新任务后需要自杀,然后当链中的最后一个活动结束时,您将返回A(M)

然后,当启动新活动时,请检查是否设置了finishself标志,如果设置了,请在启动新活动后调用finish()

finshAndStopAt(int ID) {
  Intent I = new Intent(); 
  I.putExtra("finish",ID); 

  if (getParent() == null) {
    setResult(Activity.RESULT_OK, I); 
  } else {
    getParent().setResult(Activity.RESULT_OK, I); 
  }
  finish();
另一方面,如果A(z)决定您需要返回A(…),那么我猜在A(z)中,您可以告诉调用的父级,他们需要自杀,直到到达数据中包含的某个ID为止

A(M) startActivityForResult(…)

A(Z)不知何故,你确定A(M)应该是粘性活动

finshAndStopAt(int ID) {
  Intent I = new Intent(); 
  I.putExtra("finish",ID); 

  if (getParent() == null) {
    setResult(Activity.RESULT_OK, I); 
  } else {
    getParent().setResult(Activity.RESULT_OK, I); 
  }
  finish();
}

所有A(z…m)(母公司)将监控返回数据

@Override void onActivityResult(int requestCode, int resultCode, Intent data) {

    // If we are asked to finish ourselves, pass it on ...    
    if (null != data && data.getInt("finish",stopAt) != myID) {
       if (getParent() == null) {
          setResult(Activity.RESULT_OK, data); 
       } else {
          getParent().setResult(Activity.RESULT_OK, data); 
       finish();
    }
    // else we can hang around and are the sticky activity
}

这有点痛苦,也许有人知道一种更简单的方法

你考虑过使用片段吗?通过这种方式,您可以使用FragmentManager类的实例来处理通过FragmentTransaction类的方法生成的片段历史。您还可以标记事务,然后将所有后台堆栈状态弹出到具有给定名称的事务。
我不知道是否有类似的活动方式。
看看这里:



如果您使用支持库,就不必担心您的目标SDK。

请参阅[此][1]链接。[1] :@rachirudra,看到了,它回答了一个不同的问题。它们都是相同的活动,但某些元素的值不同。我不认为那样容易;I don’我不知道哪些活动会保持开放,哪些不会,所有的活动都是一样的。这是一款有历史记录的问答应用程序。所有的问题都有相同的UI,基本上都是相同的活动。有一个历史按钮,可以让你回到一个问题的要点。由于下列活动不再相关,因此没有删除这些活动的方法。