Activity的生命周期

生命周期的分类

典型情况是指在用户正常操作界面导致Activity生命周期发生改变的情况。

异常情况是指由于内存不足导致低优先级的Activity被系统回收,或者由于当前设备的Configuration发生改变(如旋转屏幕)而导致Activity销毁重建的情况。

 

典型情况下的生命周期

在Activity从创建到消亡的过程中,通常需要先后经历以下7个生命周期函数。

onCreate:表示Activity正在被创建,在这个方法中,通常会做一些初始化的工作,比如调用setContentView去加载界面布局资源,绑定事件,初始化Activity所需的数据等。

onRestart:表示Activity正在重新启动,当Activity从不可见状态重新变为可见状态时被调用。比如用户切换到其他界面,使当前界面不可见,接着又回到这个Activity的时候。

onStart:表示Activity正在被启动,此时Activity已经可见,但是还没有出现在前台,还处于后台,无法同用户交互。

onResume:表示Activity已经可见并且出现在前台,此时可以和用户进行交互。

onPause:表示Activity正在停止,此时Activity从前台转为后台,失去交互能力,但有可能还能被看见(比如当前Activity弹出一个Dialog)。此时可以做一些不太耗时的操作,释放一些消耗CPU的资源,如存储关键数据、停止动画。onPause必须先执行完,新Activity的onResume才会执行。

onStop:表示Activity即将停止,此时Activity变为不可见状态。此时可以做一些稍微重量级的回收工作,但不能太耗时。

onDestroy:表示Activity即将被销毁,在这里可以做最后的资源回收和释放。

 

可以通过以上方法将Activity分为三种生存期。

完整生存期:活动在onCreate和onDestroy之间称为完整生存期。通常情况下在onCreate进行初始化,在onDestroy中完成资源释放。

可见生存期:活动在onStart和onStop之间称为可见生存期。通常情况下在onStart方法中对资源进行加载,在onStop中对资源进行释放,保证在停止状态下不会占用过多的CPU和内存资源。

前台生存期:活动在onResume和onPause之间称为前台生存期。此时Activity处于运行状态,可以和用户进行交互。

 

生命周期的几种情况

(1)对一个Activity,第一次启动回调过程为:onCreate -> onStart -> onResume。

(2)当用户打开新的Activity或者按HOME键回到桌面或锁屏时,当前Activity的回调过程为:onPause -> onStop。

(3)当用户再次回到Activity时,回调过程为:onRestart -> onStart -> onResume。

(4)当用户按BACK键回退时,回调过程为:onPause -> onStop -> onDestroy。

(5)在整个生命周期内,onCreate 和onDestroy只有一次调用,而其他几个生命周期函数随着用户的操作可能多次调用。

(6)假设要从当前ActivityA跳转到另一个ActivityB,ActivityA的onPause 方法肯定在ActivityB的onResume方法之前执行。

 

异常情况下的生命周期

情况一:Configuration发生改变

为了适配不同尺寸的屏幕,Android程序应该提供不同尺寸的资源,比如在平板和手机中横屏和竖屏的情况下,加载的资源文件就不一样,当系统的Configuration发生改变,在默认情况下,Activity会被销毁并重新创建。此时的生命周期如下图所示。

 

在Activity销毁时,除了调用onPause -> Onstop -> OnDestroy外,还会调用Onstop 之前调用onSaveInstanceState来保存当前Activity的状态(正常的生命周期不会调用这个方法),并将保存的Bundle对象传入到onRestoreInstanceState(在onStart之后调用)中进行恢复。在Activity异常情况下需要重新创建时,系统会默认保存当前的视图结构(比如文本框中用户输入的数据、ListView滚动位置等),每个View中都有onSaveInstanceState和onRestoreInstanceState方法,每个View会保存和恢复哪些数据可以在这两个方法中看到。

 

需要注意的是,onSaveInstanceState和onRestoreInstanceState只会在Activity异常销毁并且有机会再次显示的时候才调用,如果没有机会再次显示,则不会调用。

 

Oncreate和onSaveInstanceState参数的区别

onSaveInstanceState一旦被调用,参数一定是有值的,Oncreate被调用,参数可能为null。

 

情况二:内存资源不足导致低优先级Activity被杀死

当系统内存不足时,系统会杀死低优先级的Activity所在的进程,并通过onSaveInstanceState和onRestoreInstanceState保存和恢复数据,如果一个进程中没有四大组件在运行,这个进程将很快被杀死。所以,后台工作不适合脱离四大组件独自运行在后台中,通常需要将后台工作放在Service中保证进程有一定的优先级。

 

Activity的优先级从高到低为:

(1)前台Activity--正在和用户交互的Activity,优先级最高。

(2)可见但非前台Activity--比如弹出一个对话框的Activity。

(3)后台Activity--已经被暂停的Activity,优先级最低。

 

不想系统配置改变时Activity重建的措施

android:configChanges="orientation"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章