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_TASK
或 FLAG_ACTIVITY_CLEAR_TASK
单独工作也不起作用。
但是 FLAG_ACTIVITY_NEW_TASK
和 FLAG_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 活动仍保留在堆栈中