Activity生命周期

来源:互联网 发布:数据库修改语句的in 编辑:程序博客网 时间:2024/06/04 21:05

有关Activity生命周期的讲解有很多,在此总结一下以加深印象。
网上使用比较多的一张关于Activity生命周期的一张图:
这里写图片描述

Activity的运行状态:

  1. 运行状态:当前Activity位于前台,用户可见,可获得焦点。
  2. 暂停状态:其他Activity位于前台,该Activity依然可见,但不能获取焦点。
  3. 停止状态:该Activity不可见,失去焦点。
  4. 销毁状态:该Activity结束,或Activity所在的进程被销毁。

不同情况下生命周期方法的执行过程:

单横线是Activity1的方法,双横线是Activity2的方法。
1. 当我们启动一个Activity1时,会首先执行onCreate方法,然后onStart()–>onResume(),此时的Activity1就处于运行状态。
这里写图片描述
2. Activity被部分覆盖时:
例如当我们从Activity1跳转至对话框风格的Activity2时的执行顺序
Activity1的onPause()方法–>
Activity2的onCreate()–>onStart()–>onResume()
此时的Activity1处于暂停状态,不能获得焦点,但依然可见。
这里写图片描述
此时回到Activity1则会执行:
这里写图片描述
3.Activity被完全覆盖时:
从Activity1跳转至正常状态的Activity2(非对话框风格)时,会先执行Activity1的onPause()方法,然后执行Activity2的onCreate()–>onStart()–>onResume(),此时Activity2处于运行状态,Activity1被Activity2覆盖,这时会执行Activity1的onStop()方法。
这里写图片描述
此时若回到Activity1会执行:
这里写图片描述
4.锁定屏幕或者按HOME键回到主界面时:
这里写图片描述
此时如果解锁或回到当前Activity,则会执行:
这里写图片描述
5.用户主动退出当前Activity,或Activity由于系统内存不足被杀死时:
这里写图片描述

另外几个常用的方法:

1.onWindowFocusChanged:

窗口获得或失去焦点时调用
获得焦点时在onResume()方法之后调用:
这里写图片描述
失去焦点时在onPause()方法之后调用:
这里写图片描述
onSaveInstanceState:
系统会自动调用onSaveInstanceState来保存Activity的一些数据,但当除它默认要保存的数据外,我们还要保存一些其他数据的时候, 我们就需要覆盖onSaveInstanceState()方法来保存Activity的附件信息。例如在播放视频过程中,横竖屏切换要保持当前播放时间进度,在默认情况下播放时间是不被自动保存的。
onSaveInstanceState()方法在系统销毁当前Activity时调用,也是在onPause()方法之后调用的,如上图。

2.onRestoreInstanceState

1.系统杀死不在前台的Activity后,用户再回到此Activity时调用
2.用户改变屏幕方向时调用。
当我们旋转屏幕时,生命周期的执行顺序如下:
屏幕旋转其实就是Activity销毁重建的过程。
这里写图片描述

3.onConfigurationChanged

屏幕方向改变时销毁重建Activity的过程会消耗一定的资源,我们可以为一个Activity指定一个特定的方向,指定之后即使转动屏幕方向,显示方向也不会跟着改变:
1.指定为竖屏:
在AndroidManifest.xml中指定Activity的android:screenOrientation=”portrait”属性。
或者在onCreate方法中指定:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

2.指定为横屏:
在AndroidManifest.xml中指定Activity的android:screenOrientation=”landscape”属性。
或者在onCreate方法中指定:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

但是如果我们想让我们的Activity跟随屏幕的旋转而旋转,又不希望不断的执行销毁重建的过程,则可采用下面的方法:
在AndroidManifest.xml中为Activity设置android:configChanges=”orientation”
这个属性被设置后,当Activity方向改变时并不会执行销毁重建的过程,而是会调用onConfigurationChanged()方法。
但是,自从Android 3.2(API 13),在设置Activity的android:configChanges=”orientation”后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置”orientation”,你还必须设置”ScreenSize”。
解决方法:
AndroidManifest.xml中设置android:configChanges=”orientation|screenSize“

本文参考:http://blog.csdn.net/liuhe688/article/details/6733407

1 0
原创粉丝点击