生命周期

    在onPause里是不能做太耗时的操作的,因为只有当前的onPause被执行了,后面新的activity的onResume才会被执行;能在onPause里执行的操作,比如说数据储存,还有停止动画。而在onStop里,太耗时的操作一样不能做,只能是写稍微重量级的回收工作。在onDestroy里,我们就可以做一些回收工作和最终的资源释放。

    比较独特的是,当新启动的acticity是透明主题的话,原activity的onStop方法不回被调用。当用户点击的是back键时,OP,OS,OD都会被执行,宣布这个activity消亡。


    当系统配置发生改变后,Activity会被销毁,此时,系统会在onStop执行前调用onSaveInstanceState方法来把数据保存到Bundle里,然后在重建时,把Bundle对象传递给onCreate方法,之后在执行完onStart方法后,执行onRestoreInstanceState方法恢复活动状态。这些步骤只会在异常情况执行。对于具体的视图,都有自己的onSaveInstanceState和onRestoreInstanceState方法,系统会自动地保存部分的数据并恢复它们,但有一些是需要手动去储存和恢复的,具体的细节需要去阅读视图的源码,具体的手动方法是操作Bundle对象,比如用它来判断是否发生了配置改变。保存的过程:Activity -> onSaveInstanceState -> Window -> 顶级容器ViewGroup -> 子元素执行。对于onRestoreInstanceState方法,一旦被调用,则里面的Bundle对象一定是不为空的,这和onCreate不一样,因为它只有异常是会被调用,而调用则意味异常了,Bundle就一定不为空。

    另外一种情况是内存不足时,系统回收Activity,这时,会按前台活动,非前台活动但可见,后台活动从高到低的优先级保留活动。被杀死的活动会和系统配置发生改变后的活动一样,先调用onSaveInstanceState,后onCreate,onRestoreInstanceState。


    对于系统配置发生改变,碎片可以通过调用setRetainInstance保存实例,活动则可以通过在menifest文件中设置configChanges属性来保存活动实例,比较常用的属性值为:locale,orientation,keyboardHidden。一旦设置该属性,系统就会调用onConfigurationChanged方法自动处理配置改变的问题。对于上述的方法,不适用于系统回收的情况。

    

你可能感兴趣的:(Android进阶)