前台状态:
通俗的说就是可以看到,且可以操作(有焦点)的状态
可视状态:
即可以看得见(没有被完全遮挡),但是没有焦点,不可以触摸操作;比如躲在对话框后面的activity
后台状态:
backgroudstate
已经看不到了,系统可以将这个进程杀死来回收内存。如果在这种状态下activity被系统杀死了,那么在用户重新打开这个activity的时候,它的onCreate方法会使用之前onSaveInstanceState(Bundle)保存的状态数据,来让自己恢复到之前的状态
空进程状态:
一个没有持有任何activity和任何应用组件的进程,比如Services或者广播接受者,当内存不足的时候,它们将会被先杀死并回收。
也就是说onSaveInstanceState(Bundle)会在activity转入后台状态之前被调用,也就是onStop()方法之前,onPause方法之后被调用;我们都知道在默认情况下,在旋屏之后,activity会重新经历一次生命周期,下面的log就是在点击旋屏之后的执行顺序:
activity状态保存:安卓3.0开始,应用只有在onstop()方法返回之后被杀死也就是说在执行完onStop()方法之前,应用都不可能被杀死你应该在onPause()方法中去存储那些持久性的数据,比如用户的输入等。onSaveInstanceState(Bundle)将在activity转入“background state后台状态”之前被调用,能让我们存储一些activity的动态的状态值到Bundle对象中,以便在之后调用onCreate(Bundle)方法时用到。
修改AndroidManifest.xml,把该Activity添加android:configChanges="orientation",执行横竖屏切换
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
6、再执行横竖屏切换,发现不会再打印相同信息,但多打印了一行onConfigChanged onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onConfigurationChanged-->
7、把android:configChanges="orientation" 改成android:configChanges="orientation|keyboardHidden",执行横竖屏切换就只打印onConfigChanged onConfigurationChanged-->
8、执行步骤4
onConfigurationChanged-->
onConfigurationChanged-->
总结:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
网友评论