说实话,刚接到这个需求的时候我内心是拒绝的。因为从用户角度来讲,我既然手动杀死了就是想关闭这个App,关闭的原因有很多,但是重启后还停留在我最后关闭时的页面就不可理解了。但是需求方是大佬,再不愿意也得做。下面说说思路及实现方式。
1.功能思路
恢复关闭前的页面,是要恢复最后一个Activity的信息,还是恢复整个Activity栈的信息,经需求方要求是恢复所有打开的页面,也就是说恢复整个Activity栈。
Activity列表可以通过我们自己在Application中实现个队列缓存,也可以通过反射获取。这里不详细讲,需要的同学自己搜索一下。
2.实现过程
既然是要恢复,也就需要保存Activity栈信息到本地。但是这里有个问题,即使保存了Activity栈信息,怎么去恢复整个Activity栈呢?直接将Activity栈恢复什么的我是没有找到方法。我们打开Activity是通过Intent打开的,于是退而求其次,保存Intent队列。
那怎么保存Intent?在Application中定义一个全局变量集合,用来缓存Intent。商业项目中Activity都会抽象一个BaseActivity,在BaseActivity中定义一个变量,用来缓存当前Activity的Intent。而后在OnCreate()中获取Intent,将此时获取的Intent存入Application的集合中。OnDestory()时,通过刚才定义的变量Intent去Application的集合中删除该Intent。这样Intent集合跟Activity栈是一致的。
然后startActivity跟startActivityForResult怎么区分呢?
将requestCode信息保存进Intent中,后面通过Intent打开Activity时,判断该值就可以区分了
到这里,基本的缓存策略就完成了,我们手动杀死App时是没有任何生命周期回调的,所以每次保存时
都要将当前的Intent集合保存到本地
保存到本地的方式有很多种,因为我们要保存的是对象,所以我采用对象流的方式保存到文件中
大家都看到那个Exception信息了吧,Intent无法直接通过对象流保存到本地中。于是我定义了一个用来保存Intent信息的bean类
在BaseActivity中的保存Intent操作,将Intent的数据迁移至CacheIntent中
然后再用对象流保存到本地文件中就没问题了。
接下来说一下打开过程,因为欢迎页,及MainActivity是不需要缓存的,所以我选择在MainActivity来初始化缓存的Intent列表及打开Activity。
Application中需要定义一个集合,是用来缓存需要重新打开的Intent的。
在MainActivity调用初始化
将缓存在文件中的数据取出