Android:打开活动而不保存到堆栈中

时间:2012-09-10 19:50:45

标签: android back-stack

我有2项活动:Main和List。

从Main您可以打开List;从列表中,您可以打开Main。

我希望List的每个开头都保存到'历史'中。因此,从Main 按回来不能返回List。

有可能吗?

10 个答案:

答案 0 :(得分:137)

开始列表Activity时,请设置Intent标志,如下所示:

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

FLAG_ACTIVITY_NO_HISTORY标志使新Activity不会被添加到历史堆栈中。

注意:正如@Sam指出的那样,您可以使用i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);代替。没有功能差异。

答案 1 :(得分:81)

在清单文件中添加:

android:noHistory="true" 

到您不想保留在堆栈中的活动。

答案 2 :(得分:23)

将新任务与清除结合使用。当其他选项没有时,这适用于我的情况。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Clear the entire history stack and start a new activity on Android

答案 3 :(得分:18)

看来,如果你在打开另一个活动后立即调用了活动中的finish(),那么已完成的活动将从堆栈中删除。

例如:

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();

答案 4 :(得分:4)

在我的特定情况下,FLAG_ACTIVITY_NO_HISTORY无效。单独FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK本身也不起作用。

FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK一起工作。

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

答案 5 :(得分:2)

只是想在Kotlin中添加一种方法:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))

答案 6 :(得分:1)

答案 7 :(得分:1)

最新答案,但为其他答案增加了一些深度。一切都取决于您希望从该活动开始的其他活动会发生什么

选项1-仅此一项活动不应具有通话活动历史记录

然后就做:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

选项2-从该特定活动开始的所有活动都不应具有历史记录

然后添加呼叫活动的清单:

android:noHistory="true" 

但是,如果您确实希望在新活动中有历史记录,则必须手动删除该标志:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

希望能清除其他答案:)

答案 8 :(得分:0)

如果活动已经在运行,请尝试FLAG_ACTIVITY_CLEAR_TOP:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

答案 9 :(得分:-3)

您是否可以覆盖特定活动的后退按钮以停止“返回”功能?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}