解决Can not perform this action after onSaveInstanceState异常总结

转发请标明来源:http://blog.youkuaiyun.com/rflyee/article/details/74723891

上篇博客(这里这里)从源码层面分析了Can not perform this action after onSaveInstanceState异常产生的原因及流程,

接下来分析下该崩溃的设计原因以及如何避。

该异常的设计原因

        大家都知道系统在内存吃紧时会按规则优先kill掉部分非前台activity,为了保证用户体验,系统在kill掉某个activity之前会先调用onSaveInstanceState,将当前window的一些重要状态以bundle的形式持久化,当用户回到该activity时,再通过onCreate、onRestoreInstanceState等方法恢复之前的状态,给用户一种该界面从来没有被kill的假象,从而提升用户体验。

    那么问题来了,在系统onSaveXXX保存状态之后,一直到onRestoreXXX恢复状态之前,这段时间里程序如果再操作window,比如操作FragmentTransaction#commit()、操作FragmentDialog#show()/dismiss(),这些操作肯定没有保存在Bundle中,也就是下次onRestoreXXX恢复状态时是没有这些操作的,也就是所谓的lose state丢失状态,这样可能给用户一种前后不一致的用户体验。所以安卓团队为了“提升用户体验”,saveState之后再操作window就抛出一个IllegalStateException 异常,提醒(逼迫)开发者注意喽。

异常出现时机

如果细心可能会发现,不同的系统异常抛出的时机是不一样的。(还记得上篇文章源码中的saveAllState()方法中改变mStateSaved变量的判断了吗)
原因是3.x之后由于内存吃紧系统主动kill Activity的时机发生了变化,导致onSaveInstanceState的调用时机发生了变化。
变化如下:
    3.x之前:
 onPause()之后activity可能被系统kill。因此:(optional)onSaveInstanceState() -- onPause()
    3.x之后:
    onStop()之后activity可能被系统kill。因此:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值