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


94

我有2个活动:Main和List。

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

我想它,以便名单的每一个开放并没有得到保存到“历史”。因此,从Main上按回去将无法返回到列表。

可能吗?


11
如果“ list”以“ main”开始,则finish()在之后立即调用它startActivity(...)。这样,如果用户从“ main”按“ BACK”,将没有任何内容可返回。
Squonk 2012年

这是通知导航,但这些概念可以适用developer.android.com/guide/topics/ui/notifiers/...
凯文·李

Answers:


160

当开始您的列表时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);改用。没有功能上的差异。


2
只需对此方法做一点评论:如果只有2个Activity,则此方法将完美工作。但是,如果活动列表能够启动另一个活动(假设第三个活动),则按一下第三个活动中的后退按钮将返回到主活动,而不是活动列表
VinceFR 2012年

确实。不幸的是,没有办法避免这种情况。没有Intent标志说明“仅在不返回Activity原点时才添加到历史记录”。
埃里克(Eric)

1
否,但FLAG_ACTIVITY_NEW_TASK标志将完成此工作,活动列表将添加到历史记录中,但始终位于顶部,因此从主活动的后退操作将不显示活动列表
VinceFR 2012年

7
你有什么用什么特别的原因setFlags()getFlags()代替Intent.addFlags()
山姆

1
@VinceFR正是我想要的!
a-

90

在清单文件中添加:

android:noHistory="true" 

您不想保留的活动。


与使用no_history标志开始活动有什么不同?
realtebo 2012年

1
就像您在问题中所说的:“列表的每次打开都不会保存到'历史'中”,因此,只要您再次打开应用程序,就会进入主要活动
Marcin S.

@MarcinS。当应用程序不在最近的应用程序列表中时,它将不起作用。您能解释一下为什么会这样吗
Ajit Kumar Dubey

1
那么这两种方法(清单和标志)有什么区别?
pumbosha

@pumbosha清单方法将始终使该活动脱离历史记录。标志方法使您可以在运行时控制该行为。
约翰·克劳福德

27

使用新任务进行清除。在其他情况下,这在我的情况下可行。

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

清除整个历史记录堆栈并在Android上开始新的活动


1
这将是很棒的,但是有没有办法停止系统席卷的“更改任务”动画?不幸的是,添加FLAG_ACTIVITY_NO_ANIMATION并不能阻止它!
androidguy

这对应用速度有影响吗?
阿卡奥·皮塔 AcauãPitta)

23

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

例如:

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

如果您的手机速度不够快,您会看到以前的活动正在进行中。
诺兰

@Nolan只有在您开始活动之前完成
HenrikBøgelundLavstsen 17年

7

在我的特定情况下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);

4

较晚的答案,但增加了其他答案的深度。这一切都取决于您希望从该活动开始的其他活动中发生什么

选项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);

希望能解决其他问题:)


3

只是想添加一种在Kotlin中执行此操作的方法:

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

2
更多关于Kotlin的方式: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d

2

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

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


-4

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

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

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

6
不要这样 出于特定目的截取BACK是可以接受的,但仅这样做是无声地消耗BACK按键并防止终止连接Activity不是一个好习惯。
Squonk 2012年

1
完全同意^只是一种选择。
Broak 2012年

1
OnBackPressed那个。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.