转发请标明来源: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
异常,提醒(逼迫)开发者注意喽。