activity生命周期详解
1.首先回顾一下Activity的生命周期,具体流程见下图:
Activity一共有七个生命周期方法:
从启动页面1,再启动页面2,燃火返回页面1,页面2的生命周期方法用橙色表示
1)一个Activity页面启动 执行 oncreate()--> onStart() --> onResume()
2)开启第二个页面时 第一个页面先onPause() ---> 第二个页面 oncreate()--> onStart() --> onResume()
3)当第二个页面执行到onResume()时,第一个页面不在可见 执行onStop()
4)当从页面2返回页面1时,页面2 先onPause(),返回页面1时,由于已经停止(但未销毁),页面1 执行onRestar()-->onStart()-->onResume
5)当第二个页面执行到onResume()时,第二个页面不在可见 执行onStop()-->onDestory()停止并销毁
观察打印结果:
2.页面横竖屏切换时Activity的生命周期
Activity的生命周期正常情况下,是按以上流程的,但是当页面横竖屏切换生命周期又是另外一种情况:
横竖屏切换时,当前页面先暂停 onPause(),然后重新加载页面 oncreate()--> onStart() --> onResume()
为了防止屏幕转动而重新加载Acitivy,可以禁止屏幕转动
<activity android:name="com.example.savestateactivity.MainActivity" android:label="@string/app_name" android:screenOrientation="landscape" >
该android:screenOrientation属性,他有以下几个参数: "unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向. "landscape":横屏显示(宽比高要长) "portrait":竖屏显示(高比宽要长) "user":用户当前首选的方向 "behind":和该Activity下面的那个Activity的方向一致(在Activity堆栈中的) "sensor":有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。 "nosensor":忽略物理感应器,这样就不会随着用户旋转设备而更改了("unspecified"设置除外)。 |
android:configChanges="orientation|keyboard|keyboardHidden" 通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChanged()方法。在AndroidManifest.xml中添加上诉代码的含义是表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行onCreate()方法,而是直接执行onConfigurationChanged()。如果不申明此段代码,按照Activity的生命周期,都会去执行一次onCreate()方法,而onCreate()方法通常会在显示之前做一些初始化工作。所以如果改变屏幕方向这样的操作都去执行onCreate()方法,就有可能造成重复的初始化,降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。这是需要千万避免的。 |
关于 activity状态保存持久化可以另外一篇文章:http://blog.csdn.net/lang791534167/article/details/38544213