在开发过程中,我们可能会遇到一种需求,那就是在跳转到新的activity的同时销毁之前打开的任意个activity。
比如,注册功能。一般来说,注册需要分为多个步骤,1、填写手机号,输入验证码;2、填写基本资料;3、设置头像或密码等。
如果这三个步骤每一个都使用一个activity,那么在注册流程结束时,我们需要销毁这三个activity,不然的话,当我们返回时,看到的还是注册界面,显然不对。
如果销毁一个activity,显然很简单,只需要启动新activity的时候调用finish()就ok了,那销毁多个activity又该怎么办呢?
网上有人给出的方案是使用一个ArrayList<Activity>来管理Activity的引用,需要销毁时只需要遍历这个集合然后对每一个元素调用finish()即可。这样虽然可以实现,但是存在内存泄漏的风险,因为如果集合中引用Activity的元素不清空的话,Activity对象就没办法被垃圾回收器回收,造成内存泄露。
网上还有一种方案就是往需要销毁的activity发送广播,activity收到广播之后就自行销毁,这种实现方式效率不高,个人感觉也不优雅。
今天,我来介绍两种方式来实现这种需求:
1、使用Intent的FLAG_ACTIVITY_CLEAR_TASK标记,这个标记可以清空要启动的activity所在的task栈。什么意思呢?假如现在任务栈里面有A、B、C三个activity,这时C启动D,如果加上这个标记,那么启动D的同时就会移除A、B、C,这样这个任务栈里面就只剩新启动的D了。注意:这个标记需要与FLAG_ACTIVITY_NEW_TASK这个配合使用,否则不起作用。
2、使用Intent的FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK标记,这个标记可以清空要启动的activity上面的所有activity(与新启动的activity同处于一个task栈)。什么意思呢?假如现在任务栈里面有A、B、 C、 D四个activity,这时D启动A,带上这两个标记,因为A已经在这个task栈中了,这个时候不会启动新的task栈,同时系统发现A的上面有B、C、D,所以系统会将这三个activity从task栈中移除,最终,这个task只剩下A了。
在Android开发中,为了防止用户回退到之前的步骤,如注册流程中的各个页面,需要在跳转时销毁多个activity。文章探讨了使用ArrayList管理activity引用(可能导致内存泄漏)和广播通知activity销毁(效率低)的传统方法,并介绍了两种更优雅的解决方案:1) 结合FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_NEW_TASK,启动新activity时清除整个任务栈;2) 使用FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK,只移除目标activity上方的activity,保留目标activity本身。这两种方法能有效且高效地完成activity的销毁操作。

7142

被折叠的 条评论
为什么被折叠?



