Android生命周期大概分为两种情况:
-
正常情况:
- 第一次启动,回调如下:onCreate --> onStart --> onResume.
- 退出或者销毁Activity,回调如下:onPause --> onStop --> onDestroy.
-
打开一个新的Activity,旧Activity会先调用onPause(), 然后再启动新的Activity。回调如下:
-
从新Activity返回旧Activity时,也是新Activity先调用onPause(),然后等旧Activity回调onRestart() --> onStart() --> onResume()启动后,新Activity再销毁。
- 如果新Activity采用了透明主题,那么当前Activity不会回调onStop()。
-
异常情况:
-
资源相关的系统配置发生改变导致Activity被杀死并重建(例如旋转屏幕引起系统配置发生改变),Activity先正常退出,再重新创建。
- 系统会调用onSaveInstanceState()保存当前Activity的状态,并在onStop()之前调用。
- Activity重建时会调用onRestoreInstanceState()或者onCreate()恢复数据。onRestoreInstanceState()是在onStart()之后调用。
-
对于onSaveInstanceState()的调用,个人理解为Activity除了即将被销毁并且有机会重新显示的情况下会被调用(比如手机旋转引起Activity重建),还有正常停止但也有机会重新显示的情况下也会被调用(比如跳转到里新的Activity)
- 资源内存不足导致低优先级的Activity被杀死,其数据存储和恢复过程和上述完全一致。
-
Activity按照优先级从高到低,可以分以下三种:
(1). 前台Activity —— 正在和用户交互的Activity,优先级最高。
(2). 可见但非前台Activity —— 比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户直接交互。
(3). 后台Activity —— 已经暂停的Activity,比如执行了onStop,优先级最低。
- 在AndroidManifest.xml文件里给Activity指定configChanges属性可以设置它不用重新创建。
android:configChages="orientation"
- 常用的configChanges属性有locale、orientation和keyboardHidden。还需注意screenSize和smallestScreenSize。
项目 | 含义 |
---|---|
locale | 设备的本地位置发生了改变,一般指切换了系统语言 |
keyboardHidden | 键盘类型的可访问性发生了改变,比如用户调出了键盘 |
orientation | 屏幕方向发生了改变,比如旋转了手机屏幕 |
screenSize | 当屏幕的尺寸信息发生了改变,但旋转设备屏幕时,屏幕尺寸会发生变化,这个选线比较特殊,它和编译选项有关,但编译选项中的minSdkVersion和tartgetSdkVersion均低于13时,此选项不会导致Activity重启,否则会导致Activity重启(API 13新添加) |
smallestScreenSize | 设备的物理屏幕尺寸发生了改变,这个项目和屏幕方向没关系,仅仅表示在实际的物理屏幕的尺寸改变的时候发生,比如用户切换到了外部的显示设备.这个选项和screenSize一样,但编译选项中的minSdkVersion和tartgetSdkVersion均低于13时,此选项不会导致Activity重启,否则会导致Activity重启(API 13新添加) |