1

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

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

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

更新:

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

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

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

4

3 回答 3

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
}

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

于 2012-05-10T06:42:53.620 回答
0

作为一个通用的响应,我会说继续弹出,直到弹出返回的 Activity 是您想要的,然后可能将其推回(如果需要)。

于 2012-05-10T05:20:27.410 回答
0

你考虑过使用 Fragments 吗?通过这种方式,您可以使用 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。

于 2012-08-18T06:24:24.587 回答