清除Android后台堆栈

时间:2011-07-22 17:55:10

标签: android

我正在尝试做与this问题类似的事情。

我有一个主应用程序A,子应用程序B和C. B是一个可搜索的字典,C是一个定义,所以如果你搜索很多单词,你最终可能看起来像A的堆栈> B> C> B> B> C> B> C> C> C ......等等。

每当我回去,我都想回到原来的B,所以我希望后排基本上停留在A> B一直都是。

我目前使用Intent进行设置,所以当从C按下后退按钮时,它会转到B的新实例,但这显然不是我想要的。

想法?

3 个答案:

答案 0 :(得分:2)

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (splash.sdk < 5 && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            onBackPressed();
        }

        return super.onKeyDown(keyCode, event);
    }
    //This will make the back button exit the app to the home screen.
    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
        return;
    }

答案 1 :(得分:2)

不应该从C回来带你到原来的B?所以堆栈应该如下所示:

A>
  B>
    C<
  B>
    C>
      C<
    C<
  B<
A

with&gt;进入下一个活动,&lt;作为后退按钮?

你可以为所有的活动覆盖onBackPressed,所以对于C它会加载一个新的B,B它会加载一个新的A,而A你会加载moveTaskToBack(true);,但这不是一个解决方案而是更多的黑客攻击使它工作。

尝试使用onResume,以便B像默认情况下那样出现。将任何相关变量设置为新活动中的变量。如果你在来自C时只想要这个,那么在加载C时有一个设置为true的类boolean,并在onResume或onRestart中检查它。如果是,则将所有内容设置为default / blank,并将boolean设置为false。如果没有,加载它是如何(这是如果他们回家并回到应用程序,基本上)。我不在我的办公桌,但我认为你会想要:

@Override
    public void onResume() {
        super.onResume();
        if(fromC == true){
        //Set all variables to load default dictionary
        fromC = false;
        }
    }
}

这应该使原始B表现得像新的B.

或者说,你可以通过简单的方式完成它,当你调用意​​图加载这样的新B时:

startActivity(getIntent());
finish();

这将使得只有一个B.当你回去时它作为一个空白加载有点不同,需要类变量,或者我正在考虑的其他一些棘手的技巧。这就像你想要做的那样:.zip of small sample

如果您可以将代码重新编写为类似的东西(如果有意义的话,您可以使用适当的变量来设置正常工作)。

答案 2 :(得分:0)

您可以设置Intent标志来执行此操作。假设您在Activity C,并且想要致电Activity B:您在名为Intent的{​​{1}}上添加了一个标记。所以:

FLAG_ACTIVITY_CLEAR_TOP

这样做要么转到后端堆栈中的B的顶层实例(并清除顶部的其他所有内容),要么创建一个新实例(如果不存在)。如果有一种方法可以通过启动标志执行此操作,我还没有解决 - 有一些类似的模式,但我认为没有相同的。