activity生命周期 详解

activity生命周期详解

1.首先回顾一下Activity的生命周期,具体流程见下图:


Activity的七个生命周期:
onCreate 是必须实现一个方法, 创建Activity时执行,在该方法中通过setContentView()来指定activity中要显示的xml布局资源文件;在该方法中完成初始化变量,组件,开启线程下载等操作
onRestart: activity从onStop状态再次被启动时执行
onStart:  当activity创建完成执行,activity进入可视状态
onResume: 准备就绪, activity显示在屏幕最上方,可以和用户进行交互( 接受用户输入,获取手势等 )
onPause: 准备从 当前activity启动一个新的activity,先暂停当前activity再启动新的activity
onStop: 当新启动的activity准备就绪( onResume ),旧的activity由onPause进入onStop状态
onDestroy: activity销毁时调用该方法,是activity最终的生命周期方法,执行该方法后,销毁当前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()方法,就有可能造成重复的初始化,降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。这是需要千万避免的。

3、Activity状态保存,persistend 持久化
Activity 运行生命周期onPause或onStop方法,该activity虽然不可见,可是该activity的对象依然存在内存中,所以该activity的成员变量和状态仍然是存在的。
然而,当系统内存紧张时,系统会自动回收不可见activity,被回收的activity会执行onDestroy进行销毁。当我们此时按下回退键返回被销毁activity时,会通过onCreate再次重建页面(这时我们是不容易发现该activity曾经被销毁过),但是被销毁activity成员变量值的内容由于再次onCreate而恢复初始化状态,针对这种情况,为了确保返回依然activity仍然保存之前的页面信息状态,需要重写activity的回调方法onSaveInstanceState().来进行状态保存


总结:定义生命周期的优点:
①当用户接一个电话或切换到另一个程序不会崩溃
②当用户后台运行程序时不会销毁有价值的系统资源
③当用户离开再返回你的应用时不会丢失用户的进程
④当手机屏幕进行横竖屏切换的时候不会崩溃或者丢掉用户的进程

关于 activity状态保存持久化可以另外一篇文章:http://blog.csdn.net/lang791534167/article/details/38544213


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值