关于Activity生命周期相关总结
参考:https://developer.android.com/reference/android/app/Activity
Q:如何避免配置改变时Activity重建 A:如果不配置Activity configChanges属性,系统默认对Activity进行销毁重建操作. API13以下,Activity configChanges属性中含有orientation即可避免Activity销毁重建. API13及以上,Activity configChanges属性中同时含有orientation和screenSize即可避免Activity销毁重建. 即android:configuration="orientation|screenSize"
注意需要同时配置这两个属性才好使. 这样当屏幕旋转的时候就不会重新创建Activity 但是可以通过onConfigurationChanged(configuration newConfig)得到新的变动.
Q:onSaveInstanceState和onPause的区别 A:onPause算是Activity的lifecycle回调并且不是killable的,也就是说系统给你保证了你在这个方法时不会被kill. onSaveInstanceState不算lifecycle的回调,但是有一个参数Bundle给你用来保存各种状态.另外onPause方法不能做耗时操作,因为如果是启动另一个Activity的话,会影响到下一个Activity的出现. 因为得onPause执行完了之后才会执行下一个activity的onCreate(),onStart()等相关生命周期方法
Q:onResume和onStart的区别是什么 A:都是在界面重新可见的时候调用,具体onStart总是在onResume之前. onStart的时候只是可见,onResume的时候可交互.
Q:优先级低的Activity在内存不足被回收后怎么做可以恢复到销毁前的状态 A:在onSaveInstanceState(Bundle)通过Bundle保存状态, 然后当Activity被重建时候会在onCreate(Bundle)方法中体现出来. 或者也可以通过onRestoreInstanceState(Bundle)来做.
关于Lifecyle文档里是这么描述的: In general the movement through an activity's lifecycle looks like this: | 生命周期 | Killable | | :-------- | --------:| | onCreate() | false| | onStart() | false | | onResume() | false | | onPause() | false | | onStop()
| true | | onDestroy()
| true|
其中有一个killable要注意一下onStop和onDestroy是标记为killable的.
onStop() -> Called when the activity is no longer visible to the user. 你要是启动一个透明的Activity或者Dialog没有完全覆盖住原先的Activity的话, onStop是不会被调用的. 原本在一个Activity中启动另一个Dialog就不会有任何的生命周期回调. 下拉通知栏也没有任何生命周期相关回调
那么如果想要在Activity中感知Dialog弹出或者状态栏下拉怎么办呢? 通过
onWindowFocusChanged(boolean)
这个方法去感知
####originA去启动destB
originA.onPause() ->destB.onCreate() ->destB.onStart() ->destB.onResume() originA.onStop()
其中还有一个onRestart()
方法需要注意一下
在originA启动了destB以后 如果destB按返回键退出了
destB.onPause() ->originA.onRestart() ->originA.onStart() ->originA.onResume() destB.onStop() destB.onDestroy()
这个onRestart()
方法表现得和onResume差不多但是只有少了第一次
. 也即()第一次界面可见的时候不调用,之后表现得就和onResume()差不多, 只是调用时机总是onRestart->onStart->onResume.
对于两个Activity之间的关系 注意无论是启动还是返回的情况都差不多.
other.onPause() {如果不是第一次的话__目标.onRestart()} 目标.onstart()/ 目标.onResume() other.onStop()
文档上比较特殊的注明了Killable的生命周期有 onStop()和onDestroy()
Because of this,you should use the onPause() method to write any persistent data (such as user edits) to storage.
In addition, the method onSaveInstanceState(Bundle) is called before placing the activity in such a background state, allowing you to save away any dynamic instance state in your activity into the given Bundle, to be later received in onCreate(Bundle) if the activity needs to be re-created.
Note that it is important to save persistent data in onPause() instead of onSaveInstanceState(Bundle)
Because the latter(onSaveInstanceState) is not part of the lifecycle callbacks, so will not be called in every situation as described in its documentation
因为killable的问题 你应该在onPause()存数据而不是onStop(), 那么onSaveInstanceState(Bundle)什么时候用呢?
注意了onSaveInstanceState(Bundle)不算生命周期回调哦. onPause()-------------------------------> persistent data
onSaveInstanceState(Bundle) -----> dynamic instance state
其实就是用Bundle存的话容器是系统内置的Bundle 但是如果你要在onPause()存的话容器得你自己提供.
或者说本质不一样onPause()存的东西是你的Activity自始至终都活着. onSaveInstanceState(Bundle)对应的场景是你的Activity被reCreate的情况.
另外还有一个onRestoreInstanceState(Bundle)方法,一旦他被调用就说明了你的Activity一定是被reCreate了, 也可以通过onCreate(Bundle)检查Bundle是不是null来确定Activity是否被reCreate过.