App手动杀死后重新打开App恢复杀死前的页面

本文介绍了如何在App被手动杀死后,重新打开时恢复到之前的状态,包括Activity栈和Intent的保存与恢复策略。通过在BaseActivity中保存Intent,并在MainActivity中初始化和打开缓存的Activity,实现了需求。同时,文章提到了处理异常和防止异常页面反复打开的措施。
摘要由CSDN通过智能技术生成

说实话,刚接到这个需求的时候我内心是拒绝的。因为从用户角度来讲,我既然手动杀死了就是想关闭这个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调用初始化


将缓存在文件中的数据取出

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值