ctrlC & ctrlV

我们不生产代码,我们只是代码的搬运工~

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在开发安卓应用过程中,要实现登录退出或登录过期,重新打开登录页功能。看了好多方案,很多又是利用广播的,又是什么一层一层记录下来堆栈的,废JB劲!

大概查找了一些资料可以利用FLAG_ACTIVITY_CLEAR_TOP或finishAffinity()函数实现类似需求

例如四个Activity,从A(登录页)->B->C->D,这时我需要从D点了退出登录,我需要直接关闭所有Activity,并且重新打开A(登录页),可以这样写:

            val intent = Intent()
         intent.setAction("com.xxxx.xxxx.ui.login.LoginActivity")
            intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP //它可以关掉所要到的界面中间的activity
            startActivity(intent)

相当于你不需要一层一层关闭了,直接关掉所有Activity,并且重新打开登录页。

还有一种需求是这样,例如四个Activity,从A(主页)->B->C->D,这时我需要从D点跳回到A(主页),同时我需要直接关闭除了A(主页)之外,所有Activity,可以这样写:

首先要把Activity分Task,一般默认所有Activity Task名就是应用包名,如果你直接调用finishAffinity(),会把A(主页)也直接干掉了,所以我们需要单独把A(主页)分个Task,在xml里配置代码如下:

<activity
            android:name=".MainActivity"
            android:taskAffinity=".MainTask"//指定栈别名,必须包含一个.
            />

这时我们在在D页面,触发调用finishAffinity(),那么除了A(主页)以外所有的Activity,就全部关闭了,瞬间达到了关闭所有Activity,回到主页的功能。

扩展知识:什么是affinity?

  affinity是指Activity的归属,Activity与Task的吸附关系,也就是该Activity属于哪个Task。一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Task中度过自己的生命。每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于应用的包名。我们可以通过在元素中增加taskAffinity属性来为某一个Activity指定单独的affinity。这个属性的值是一个字符串,可以指定为任意字符串,但是必须至少包含一个”.”,否则会报错。

这样实现就简单多了~

posted on 2022-09-22 16:17  Rocky_  阅读(665)  评论(0编辑  收藏  举报