在开发安卓应用过程中,要实现登录退出或登录过期,重新打开登录页功能。看了好多方案,很多又是利用广播的,又是什么一层一层记录下来堆栈的,废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。这个属性的值是一个字符串,可以指定为任意字符串,但是必须至少包含一个”.”,否则会报错。
这样实现就简单多了~