如何清除堆栈历史记录?

时间:2011-02-18 03:48:12

标签: android

考虑我的应用程序包含活动A,B,C。 A从发射器发射,B从A发射.B有一个按钮。我的要求是单击B上的按钮,活动的当前历史记录A-> B应该清除,历史堆栈必须只包含C.是否可以这样做?如果是这样,请告诉我......

提前致谢!

2 个答案:

答案 0 :(得分:3)

虽然乏味,但可以通过使用Activity方法startActivityForResult(),setResult(),finish()和onActivityResult()来启动。

在伪代码中:

A: startActivityForResult(B)
B: startActivityForResult(C)
C: startActivity(D); setResult(CLEAR); finish()
D: ...
B: (onActivityResult) setResult(CLEAR); finish()
A: (onActivityResult) finish()

如果你愿意改变你的架构,那么更自然的方法就是使用FLAG_ACTIVITY_CLEAR_TOP来轻松地从A,B,C转到A。

第三种方法是将A,B和C设置为使用noHistory,但是你将失去将C退回到B或A的能力。

答案 1 :(得分:0)

我的“解决方案”是覆盖活动C中“后退”按钮的行为,以便它进入电话启动器,而不是返回活动堆栈。这样,活动A和B保留在后台堆栈上,但用户无法导航回它们。因此,最终结果与活动C是根活动相同。

/**
 * Override "Back" key on Android 1.6
 * Don't want user going back to Login or Register forms.
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        goHome();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}    

/**
 * Override "Back" key on Android 2.0 and later
 */
@Override
public void onBackPressed() {
    goHome();
}

private void goHome() {
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);    
}