在项目中需要在注销后返回到登录界面,之前退出登录采用的是直接调用主Activity的finish()方法,这样就不会在进入登录界面后点返回键返回到主界面。由于完成注销账号操作需要多个activity实现,因此之前调用finish方法的操作就不现实了,所以只能在启动LoginActivity时清空返回栈。 ### 什么是返回栈 Android 是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。我们每启动一个新Activity,就会覆盖在原Activity上,点击返回键就会销毁上面的Activity,显示下面的Activity。 ### 如何清空返回栈 java: ```java Intent intent = new Intent(this, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); ``` kotlin: ```kotlin var intent = Intent(this, LoginActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK startActivity(intent) ``` 由于kotlin的位运算符号与Java有些许不同,因此代码也有些许不同 Kotlin 位运算符号以infix函数的形式表示 如下: and(bits) 位与 同Java & or(bits) 位或 同Java | inv(bits) 位非 同Java ~ xor(bits) 位异或 同Java ^ shl(bits) 左移 同Java << shr(bits) 右移 同Java >> ushr(bits) 无符号右移 同Java >>> 参考文章:[在kotlin中添加Intent的flags(清除任务栈中的所有activity)_lplj717的博客-CSDN博客](https://blog.csdn.net/lplj717/article/details/118355962) [ Kotlin 位运算符_赵星海的博客-CSDN博客_kotlin shl](https://blog.csdn.net/qq_39731011/article/details/107791981) ### Intent中addFlags()和SetFlags()的区别 两个方法的区别是setflag是直接给intent设置新的flag,addflag是在已有flag上添加新的flag ### 各Intent Flags详解 ##### FLAG_GRANT_READ_URI_PERMISSION 如果设置了,Intent的接受者将被准许执行read操作(Intent 携带的URI数据和任何Clipdata中特定的URIs数据)的权限。 ##### FLAG_GRANT_WRITE_URI_PERMISSION 如果设置了,Intent的接受者将被准许执行write操作(Intent 携带的URI数据和任何Clipdata中特定的URIs数据)的权限。 ##### FLAG_GRANT_PERSISTABLE_URI_PERMISSION 当结合使用 flag_grant_read_uri_permission 和/或 flag_grant_write_uri_permission,URI权限授予可以坚持在设备重新启动直到明确撤销 用revokeuripermission(URI,int)。 ##### FLAG_GRANT_PREFIX_URI_PERMISSION 当结合使用 flag_grant_read_uri_permission 和/或 flag_grant_write_uri_permission,URI权限授予适用于任何前缀匹配不同于原始的授予的URI。 ##### FLAG_DEBUG_LOG_RESOLUTION 使能够使用调试功能的flag。设置之后,日志信息将在intent处理过程被输出,为了告诉你最后的解决列表被发现已创建。 ##### FLAG_DIRECT_BOOT_AUTO 用于根据直接启动感知和当前用户状态自动匹配意图的标志。 由于默认行为是自动应用当前用户状态,因此这实际上是一个哨兵值,不会根据查询的存在与否改变任何查询的输出。 相反,此值可以与 StrictMode.VmPolicy.Builder.detectImplicitDirectBoot() 结合使用,以检测调用者何时依赖隐式自动匹配,而不是确认他们想要的显式行为。 ##### FLAG_EXCLUDE_STOPPED_PACKAGES 如果设置,此意图将不匹配当前停止的包中的任何组件。如果未设置,则默认行为是在结果中包含此类应用程序。 ##### FLAG_FROM_BACKGROUND 可以由调用者设置,以指示此意图来自后台操作,而不是来自直接用户交互.。 ##### FLAG_ACTIVITY_BROUGHT_TO_FRONT 这个flag不能正常地被应用程序代码设置,而是系统为你设置由于在 launchMode 设置为singleTask模式 ##### FLAG_ACTIVITY_CLEAR_TASK 如果通过 Context.startactivity()去设置/启动一个Intent,这个flag将导致任何存在的task,将与活动开始前清除的活动相关联.也就是说,该活动成为一个原本为空的任务栈的新根,并且所有旧活动都被终结。这只能与 FLAG_ACTIVITY_NEW_TASK 结合使用。 ##### FLAG_ACTIVITY_CLEAR_TOP 如果设置,并且正在启动的活动已经在当前任务(backstack)中运行,那么,不会启动该活动的新实例,而是它上面的所有其他活动都将被关闭,而这个意图将作为一个新的意图传递到(现在的顶部)旧活动中.。 例如,考虑一个由活动组成的任务:A、B、C、D。如果 D 使用这个Flag启动B,则 C 和 D 将finish()并且 B 接收给定的 Intent ,最后结果返回栈栈现在是:A,B。 上面示例中当前运行的活动 B 实例将接收您在其 onNewIntent() 方法中开始的新intent,或者自己finish()并使用新intent重新启动。如果它已经声明它的启动模式为“multiple”(默认)并且你没有在同一个意图中设置 FLAG_ACTIVITY_SINGLE_TOP,那么它将被finish()并重新创建;对于所有其他启动模式,或者如果 FLAG_ACTIVITY_SINGLE_TOP 被设置,那么这个 Intent 将被传递到当前实例的 onNewIntent()。 这种启动模式也可以和FLAG_ACTIVITY_NEW_TASK结合使用,效果很好:如果用于启动一个任务的根活动,它将把该任务当前正在运行的任何实例带到前台,然后将其清除到其根状态。例如,当从通知管理器启动活动时,这尤其有用。 ##### FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 这个常数是在API级别21废弃掉。在API 21执用 flag_activity_new_document 替代 ##### FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 如果设置,新活动不保存在最近启动的活动列表中。 ##### FLAG_ACTIVITY_FORWARD_RESULT 如果设置,这个intent是被用来从一个现有的acitivity启动到新的acitivity,现有activity的回复目标将被转移到新的activity。这样,新活动可以调用 Activity.setResult(int) 并将该结果发送回原始活动的回复目标。 ##### FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 这个flag不能正常地被应用程序代码设置,而是系统为你设置,如果这个活动正在展开的历史堆栈(长按 Home键)。 ##### [FLAG_ACTIVITY_LAUNCH_ADJACENT](https://developer.android.google.cn/reference/android/content/Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT) 此标志仅用于分屏多窗口模式。新活动将显示在启动它的活动旁边。这只能与 FLAG_ACTIVITY_NEW_TASK 结合使用。此外,如果您希望创建现有活动的新实例,则需要设置 FLAG_ACTIVITY_MULTIPLE_TASK。 ##### FLAG_ACTIVITY_MATCH_EXTERNAL 如果在传递给 Context.startActivity() 的 Intent 中设置,如果设备上没有完整的应用程序可以处理该意图,则此标志将尝试启动免安装应用程序。 尝试从外部解析免安装应用时,支持以下 Intent 属性: - `Intent#setAction(String)` - `Intent#addCategory(String)` - `Intent#setData(Uri)` - `Intent#setType(String)` - `Intent#setPackage(String)` - `Intent#addFlags(int)` 在找不到免安装应用程序的情况下,将启动安装程序以通知用户无法解析意图。在不支持免安装应用的设备上,该标志将被忽略。 ##### FLAG_ACTIVITY_MULTIPLE_TASK 此标志用来创建一个新的task和启动一个活动到此任务 ##### FLAG_ACTIVITY_NEW_DOCUMENT 此标志用于将文档打开到一个新的任务中,该任务源于intent启动的活动。 ##### FLAG_ACTIVITY_NEW_TASK 设置此标志使activity将成为此历史堆栈上新任务的开始 ##### FLAG_ACTIVITY_NO_ANIMATION 如果通过 Context.startactivity()去设置/启动一个Intent,这个标志将阻止系统执行一个活动去下一个活动的过渡动画。 ##### FLAG_ACTIVITY_NO_HISTORY 设置此标志activity将不添加到回退栈(backStack) ##### FLAG_ACTIVITY_NO_USER_ACTION 设置此标志,将阻止onuserleavehint()正常回调发生在当前最前的活动,在它被停下来作为新启动活动被带到前面。 ##### FLAG_ACTIVITY_PREVIOUS_IS_TOP 如果设置并使用此意图从现有的一个activity a启动到新activity b,新avitivity b将不会被视为栈顶而是activity a,而是决定是否新意图传递到顶部而不是启动新的活动。 ##### FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 设置此标志使这个活动要么开始在一个新的任务或带到现有的任务的顶部,那么它将被启动作为任务的前门。 ##### FLAG_ACTIVITY_REORDER_TO_FRONT 如果在通过 Context.startactivity()去设置/启动一个Intent,如果需要启动的activity已经运行,此标志使被启动的活动被带到任务的历史堆栈的前面.。 例如,考虑一个由四个活动组成的任务:A、B、C、D。如果 D 调用 startActivity() 并带有解析为活动 B 组件的 Intent,那么 B 将被带到历史堆栈的前面,结果顺序为:A、C、D、B。如果还指定了 FLAG_ACTIVITY_CLEAR_TOP,则该标志将被忽略。 ##### FLAG_ACTIVITY_REQUIRE_DEFAULT 如果在传递给 Context.startActivity() 的意图中设置,则此标志将仅在解析为单个结果时启动意图。如果不存在这样的结果或者系统选择器会以其他方式显示,则将抛出 ActivityNotFoundException。 ##### FLAG_ACTIVITY_REQUIRE_NON_BROWSER 如果在传递给 Context.startActivity() 的意图中设置,则此标志只会在其解析为非浏览器的结果时启动该意图。如果不存在这样的结果,则将抛出 ActivityNotFoundException。 ##### FLAG_ACTIVITY_RETAIN_IN_RECENTS 默认情况下,由 FLAG_ACTIVITY_NEW_DOCUMENT 创建的文档将在用户关闭它时删除它在最近任务中的条目(返回或者它可能会完成())。如果您希望允许将文档保存在最近的内容中以便可以重新启动,您可以使用此标志。当设置并且任务的活动完成时,最近条目将保留在界面中以供用户重新启动它,就像顶级应用程序的最近条目。 接收 Activity 可以使用 R.attr.autoRemoveFromRecents 或通过显式调用 Activity.finishAndRemoveTask() 覆盖此请求。 ##### FLAG_ACTIVITY_SINGLE_TOP 如果设置,activity将不会被启动如果其正在backstack的栈顶 ##### FLAG_ACTIVITY_TASK_ON_HOME 如果在通过 Context.startactivity()去设置/启动一个Intent,此flag将使新启动任务置于当前活动任务的顶部(如果只有一个task时)。 ##### FLAG_INCLUDE_STOPPED_PACKAGES 如果设置,此意图将始终匹配当前停止的包中的任何组件。这是未设置 FLAG_EXCLUDE_STOPPED_PACKAGES 时的默认行为。如果这两个标志都设置了,那么这一个就赢了(它允许在框架可能自动设置排除标志的地方覆盖排除)。 ##### FLAG_RECEIVER_FOREGROUND 如果设置,则在发送广播时允许接收者以前台优先级运行,超时间隔更短。在正常广播期间,接收器不会自动提升到后台优先级之外。 ##### FLAG_RECEIVER_NO_ABORT 如果这是有序广播,则不允许接收者中止广播。他们仍然可以将结果传播给后来的接收者,但他们不能阻止后来的接收者看到广播。 ##### FLAG_RECEIVER_REGISTERED_ONLY 如果设置,当发送一个广播只有注册接收器将被调用,没有BroadcastReceiver组件将被启动。 ##### FLAG_RECEIVER_REPLACE_PENDING 如果设置,则在发送广播时,新广播将替换任何与其匹配的现有待处理广播。匹配由 Intent.filterEquals 定义,为两个广播的意图返回 true。当找到匹配项时,新的广播(以及与之关联的接收器)将替换待定广播列表中的现有广播,并保持在列表中的相同位置。此标志最常用于粘性广播,它只关心将广播的最新值传送到其接收器。 ##### FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS 如果设置,广播将对 Instant Apps 中的接收者可见。默认情况下,免安装应用不会接收广播。此标志在由 Instant App 使用时无效。 参考文章:[Intent中addFlags()和SetFlags()的区别和详解_琦琦进阶之路博客-CSDN博客_](https://blog.csdn.net/qq_28695619/article/details/53869594) [Intent | Android Developers (google.cn)](https://developer.android.google.cn/reference/android/content/Intent#FLAG_ACTIVITY_BROUGHT_TO_FRONT) 最后修改:2022 年 05 月 27 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏