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

时间:2012-05-10 05:15:32

标签: android android-activity pop

在制作应用程序的过程中,我有一个活动让我们称之为 A ,并且我多次打开,因为 A(1) - > A(2) - > A(3) - > ... - > A(m) - > ... - >的 A(n)的

在应用程序中我想一直回到 A(m),是否有办法将活动一直弹回到选定的活动中?

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

更新

我在这里想要实现的目标如下:我有一个问题列表,用户可以为每个问题选择不同的答案。

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

所有Q& A活动都是一样的,所以回到问题意味着弹出堆栈直到到达那里。

3 个答案:

答案 0 :(得分:2)

如果我理解正确你说你有N个SAME活动,并希望回到堆栈中的任意起点活动?

我不清楚你是否提前知道你的“粘性”活动的所有活动都应该完成,或者这是否确定在某个地方

我不知道在重复活动时将N个活动从堆栈弹出的任意方式,但你可以自己滚动,例如(未完成的代码)

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

in A(...) 
startSelf()
{

   Intent I = new Intent(this,MyActivity.class);
   if (bFinishSelf || bFinishForward) 
     I.putExtra("finishself", 1);

   if (Finishelf)  
     finish();


   startActivity(I); 

in ... all A(...) onCreate( ... 

Bundle b = getIntent().getExtras(); 
if(b !=null && extras.getInt("finishself");
  bFinishSelf = true; 

然后当你开始一个新的活动时检查是否设置了finishself标志,如果是,那么在开始新活动后调用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
}

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

答案 1 :(得分:0)

作为一般回复,我会说要保持弹出,直到pop返回的Activity是你想要的那个,然后可以将其推回(如果你需要)。

答案 2 :(得分:0)

您是否考虑过使用碎片?通过这种方式,您可以使用FragmentManager类的实例来处理通过FragmentTransaction类的方法生成的片段历史记录。您还可以标记您的交易,然后将所有后退堆栈状态弹出到具有给定名称的交易 我不知道活动是否有类似的方法 看看这里:
http://developer.android.com/reference/android/support/v4/app/FragmentManager.html
http://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html
如果您使用支持库,则无需担心是否以SDK为目标。