活动回收问题
当一个活动执行力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。