Android如何优雅的销毁多个activity

来源:互联网 发布:淘宝店铺设置在哪里 编辑:程序博客网 时间:2024/05/16 17:58

在开发过程中,我们可能会遇到一种需求,那就是在跳转到新的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了。

0 0
原创粉丝点击