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

Posted

技术标签:

【中文标题】Android:打开活动而不保存到堆栈中【英文标题】:Android: open activity without save into the stack 【发布时间】:2012-09-03 17:18:01 【问题描述】:

我有 2 个活动:主要和列表。

从 Main 你可以打开 List;从 List 你可以打开 Main。

我希望 List 的每次打开都保存到“历史记录”中。因此,从 Main 按下返回无法返回 List。

有可能吗?

【问题讨论】:

如果 'list' 开始于 'main' 则让它在 startActivity(...) 之后立即调用 finish()。这样,如果用户从“main”按 BACK,就没有什么可返回的了。 这是用于通知导航,但概念可能适用developer.android.com/guide/topics/ui/notifiers/… 请在开始下一个活动后接受finish()当前活动的回答! 【参考方案1】:

当启动列表的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个Activity,这个方法可以完美运行。但是,如果列表 Activity 能够启动另一个 Activity(比如说第三个 Activity),则在第三个 Activity 中按下后退按钮将返回到主 Activity 而不是列表 Activity 确实如此。不幸的是,没有办法避免这种情况。没有Intent 标志表明“如果不返回到原始Activity,只会添加到历史记录”。 否,但 FLAG_ACTIVITY_NEW_TASK 标志会完成这项工作,列表 Activity 将被添加到历史记录中但始终位于顶部,因此主 Activity 的后按将不会显示列表 Activity 您使用setFlags()getFlags() 而不是Intent.addFlags() 有什么特别的原因吗? @VinceFR 这正是我想要的! a -> b -> c 直接返回 c-【参考方案2】:

在清单文件中添加:

android:noHistory="true" 

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

【讨论】:

与使用标志 no_history 开始活动有什么区别吗? 就像你在你的问题中所说的“每次打开列表都不会保存到'历史'”因此,每当您再次打开应用程序时,都会将您带到主要活动 @MarcinS。当应用程序不在最近的应用程序列表中时,它不起作用。你能解释一下为什么会这样吗 那么这两种方法(清单和标志)有什么区别? @pumbosha Manifest 方法将始终将活动排除在历史记录之外。标志方法可让您在运行时控制该行为。【参考方案3】:

将新任务与清除一起使用。当其他选项没有时,这在我的情况下有效。

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

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

【讨论】:

这很好,但是有没有办法阻止系统的“更改任务”动画?不幸的是,添加 FLAG_ACTIVITY_NO_ANIMATION 并不能阻止它! 这对应用速度有影响吗?【参考方案4】:

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

例如:

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

【讨论】:

如果您的手机没有那么快,您会看到之前的活动正在关闭。 @Nolan 只有在你开始活动之前完成 这是最好的答案!!来吧,接受吧!【参考方案5】:

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

【讨论】:

不是这个问题的答案,但正是我想要的!【参考方案6】:

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

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

希望能澄清其他答案:)

【讨论】:

【参考方案7】:

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

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

【讨论】:

更多的 Kotlin 方式:Intent(this, MainActivity::class.java).apply addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) .also startActivity(it) 【参考方案8】:

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

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

【讨论】:

【参考方案9】:

将标志 FLAG_ACTIVITY_NEW_TASK 添加到您的 Intent

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK

【讨论】:

【参考方案10】:

案例:1

使用这个标志

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

在这种情况下,活动过渡在开始活动之前没有顺利工作的空白白页

cas 2:

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

如果您的手机没有那么快,您会看到之前的活动正在关闭,我希望在大多数关闭设备的日子里都能解决这个问题

【讨论】:

【参考方案11】:

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

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

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

【讨论】:

不要这样做。出于特定目的拦截 BACK 是可以接受的,但这样做纯粹是为了静默地使用 BACK 按键并防止终止 Activity 不是好的做法。 完全同意 ^ 只是一个选项。 OnBackPressed

以上是关于Android:打开活动而不保存到堆栈中的主要内容,如果未能解决你的问题,请参考以下文章

清除 android 活动堆栈开始一个新活动

即使在操作系统终止应用程序后,Android 活动仍保留在堆栈中

返回堆栈和意图标志不起作用

在Android中打开Activity而不点击通知

为从姜饼开始的所有 android 版本在 android 中创建全屏活动

Android:如何在按下按钮时关闭一个活动并在按下另一个按钮时关闭整个后台堆栈? [复制]