覆盖 onSaveInstanceState(...) 方法并不仅仅用于处理设备旋转相关的问题。用户离开当前activity管理的用户界面,或Android需要回收内存时,activity也会被销毁。
基于用户体验考虑,Android从不会为了回收内存,而去销毁正在运行的activity。activity只有在暂停或停止状态下才可能会被销毁。此时,会调用 onSaveInstanceState(...) 方法。调onSaveInstanceState(...) 方法时,用户数据随即被保存在 Bundle 对象中。然后操作系统将 Bundle 对象放入activity记录中。
为便于理解activity记录,我们增加一个暂存状(stashed state)到activity生命周期。activity暂存后, Activity 对象不再存在,但操作系统会将activity记录对象保存起来。这样,在需要恢复activity时,操作系统可以使用暂存的activity记录重新激活activity。
注意,activity进入暂存状态并不一定需要调用 onDestroy() 方法。不过, onPause() 和onSaveInstanceState(...) 通常是我们需要调用的两个方法。常见的做法是,覆盖onSaveInstanceState(...) 方法,将数据暂存到 Bundle 对象中,覆盖 onPause() 方法处理其他需要处理的事情。
有时,Android不仅会销毁activity,还会彻底停止当前应用的进程。不过,只有在用户离开当前应用时才会发生这种情况。即使这种情况真的发生了,暂存的activity记录依然被系统保留着,以便于用户返回应用时activity的快速恢复。
那么暂存的activity记录到底可以保留多久?前面说过,用户按了后退键后,系统会彻底销毁当前的activity。此时,暂存的activity记录同时被清除。此外,系统重启或长时间不使用activity时,暂存的activity记录通常也会被清除。