Activity生命周期

本文探讨了Android Activity的生命周期问题,重点介绍了如何在onStop和内存不足时保存数据,以及不同启动模式(standard, singleTop, singleTask, singleInstance)的作用和适用场景。特别关注了如何通过Bundle在Activity销毁前保存状态,并对比了各种启动模式的实例和行为。
摘要由CSDN通过智能技术生成

活动回收问题

当一个活动执行力onStop方法停止运行进入后台时,如果系统的内存不足就可能对此Activity回收操作,如果用户在该活动写入了数据就会丢失,解决方法是通过Bundle传递保存的内容。

活动被摧毁前会执行onSaveInstanceState方法,可以通过键值对的形式将信息保存到传入的Bundle中。

在活动的onCreat方法参数中就有Bundle,如果该被回收前通过onSaveInstanceState方法存入数据的话,这个参数就会保存之前存入的所有数据。

活动的启动模式

standard

默认的启动方式,会无条件的创建一个新活动到返回栈顶,如果在不同的Task里面打开了同一个Activity,则会被创建多个实例,放在不同的Task栈顶。

这种启动模式主要用于那种提供了通用功能的Activity,比如通讯录的添加联系人的Activity,如果从短信里面要点击一个手机号添加联系人,这个新启动的Activity应该和短信app相关,放在短信app的Task栈顶上面,而和通讯录没有关系,也就是返回桌面打开通讯录是首页,并且在其他地方添加联系人的时候应该是全新的实例。

singleTop

类似于Standard,唯一的不同在于singleTop会检查栈顶是否是要启动的Activity,那就会调用onNewIntent方法。

singleTask

这个模式会保证这个Activity会启动在属于它的Task里面,如果是其他Task要启动这个Activity,则会启动或者挪动这个Activity的Task放于启动Task的栈顶。

举个例子是如果在QQ里点了一个链接,选择了以浏览器打开,会发生应用间切换,然后在浏览器里面打开这个链接,随后如果一直进行返回操作,则会在浏览器最后一个Activity之后发生应用间切换回到QQ。

但是这里有个注意的点是,如果Task之间的叠加是短暂的,只适用于前台Task,如果用户点击了最近任务列表或者返回桌面,这两个不同的Task就会分开,这时候回到浏览器一直返回,就会回到桌面而不是QQ。

这样做的话是为了符合用户的直觉,因为两个Task通常代表两个app,点开最近任务或者返回桌面后两个Task必须分开,但是当没有返回时候,用户一直点返回会期望回到自己上次操作的Activity。

这种模式限制了全局只有一个Activity实例,也限制了它只会出现在自己的Task里面,如果别的Task调用它时已经存在,它会清除在它之上的Activity并且调用onNewIntent方法读取出相应的数据。

singleInstance 

这一种启动模式类似于singleTask,不同点在于这个模式会保证在它所属的Task里面只有它一个实例,如果在其他的Task里面启动它,它会创建一个新的Task压在创建Task的栈顶,随后如果返回桌面再打开这个Activity所在的app,再检查最近任务的话,会发现这个Activity消失了。但是他并没有被销毁,而是因为和新启动的Task的taskAffinity属性一样,先创建的会被隐藏起来。随后在创建这个Activity会调用onNewIntent方法创建。

一般情况下暴露给外部的Activity用singleInstance或者singleTask。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值