【问题标题】:popping a known number of activities from stack从堆栈中弹出已知数量的活动
【发布时间】:2012-05-10 05:15:31
【问题描述】:

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

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

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

更新:

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

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

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

【问题讨论】:

标签: android android-activity activity-stack


【解决方案1】:

如果我理解正确,您是说您有 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(中) 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
}

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

【讨论】:

  • 我不知道哪些活动会保持打开状态,哪些不会,所有活动都是一样的。这是一个有历史的问答应用程序。所有问题都有相同的用户界面并且基本上是相同的活动。有一个历史按钮可以让您回到单个问题的重点。在那里删除所有以下活动,因为它们不再相关。
【解决方案2】:

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

【讨论】:

  • 它们都是相同的活动,但某些元素的值不同。那样没那么容易
【解决方案3】:

您是否考虑过使用片段?通过这种方式,您可以使用 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多