详解Android Activity---Activity的生命周期

时间:2022-06-30 15:57:42

转载注明来自:  http://www.cnblogs.com/wujiancheng/

一、正常情况下Activity的生命周期:

 Activity的生命周期大概可以归为三部分

整个的生命周期:onCreate()可以设置所有的“全局”状态, onDestory()可以释放所有的资源

可见的生命周期:onStart()显示给用户的UI数据和资源等, onStop()当不再需要显示时候,可以释放资源

前台的生命周期:该生命周期活跃,onResume()回到前台,onPause()不可见状态或被覆盖

不要在onCreate()方法中执行耗时的操作,onStart()及onResume()不可进行过多操作,不然打开桌面应用图标会卡顿。

详解Android Activity---Activity的生命周期

(1)onCreate:表示Activity正在被创建。可以调用setContentView加载布局资源、初始化各控件、设置监听、并初始化一些全局的变量。因为在Activity的一次生命周期中,onCreate方法只会执行一次。在Paused和Stopped状态下恢复或重启的下,这些控件、监听和全局变量也不会丢失。即便是内存不足,被回收了,再次Recreate的话,又是一次新的生命周期的开始,又会执行onCreate方法。

(2)onRestart:表示Activity正在重新启动。当处于非栈顶状态的活动需要再次返回栈顶,展现给用户的时候,触发该方法。调用的场景主要有:home键之后,然后切换回来、Activity跳转到另一个Activity之后,按back键返回原来Activity。很少调用,因为它只在onStop之后才可能调用,所以操作放在onStart方法里面就比较好。

(3)onStart:表示Activity正在启动,这时Activity已经可见,但是还没有出现在前台,还无法和用户交互。

(4)onResume:表示Activity已经可见了,并且出现在前台并开始活动。

(5)onPause:表示Activity正在停止,正常情况下,onStop会接着调用,但是打开的是透明的Activity,不会调用onStop,返回会调用onResume。可以执行一些轻量级的释放工作(耗时会影响到新的Activity显示,onPause必须执行完,新Activity的生命周期才会执行)例如:停止动画、取消broadcast receivers等。

(6)onStop:表示Activity将要停止,极有可能被系统所回收,在某些极端情况下,系统可能是直接杀死应用程序的进程,而不是调用onDestory方法,所以我们需要在onStop方法中尽可能的释放那些用户暂时不需要使用的资源,防止内存泄露。可以做一些稍微重量级的回收工作,例如:数据保存,需要用到的数据库操作。

(7)onDestory:表示Activity将被销毁,确定某些资源是否没有被释放,做一些最终的清理工作,比如在这个Activity的onCreate中开启的某个线程,那么就要在onDestory中确定它是否结束了,如果没有,就结束它。

几种生命周期流程的情况:

 (1)现在有两个Activity,A 和B,都重写了所有的生命周期方法。

进入A,回调:AonCreate-->AonStart-->AonResume。返回桌面:AAonPause-->AonStop。

点击按钮进入B,回调:AonPause-->BonCreate-->BonStart-->BonResume-->AonStop。

按下back键,回调:BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory

(2)启动对话框样式的Activity,有两个Activity,A
和B(对话框式Activity)。

从A进入B,回调:AonPause-->BonCreate-->BonStart-->BonResume
,并不会调用onStop。

按下back键,BonPause-->AonRestart-->AonStart-->AonResume-->BonStop-->BonDestory回调:BonPause-->AonResume-->BonStop-->BonDestory。

启动对话框并不会有生命周期的变化,这里启动的是透明主题的Activity。

二、关于SaveStateInstance



   系统配置发生改变后或内存瓶颈时,生命周期发生异常,会调用onSaveInstanceState和onRestoreInstanceState这两兄弟,这就很好的解决Android应用的内存问题



旋转屏幕时,生命周期大概如下图(若不想,可在清单文件设置android:configChanges="orientation|keyboardHidden|locale"):

详解Android Activity---Activity的生命周期

onSaveInstanceState:在Activity(onStop之前)被回收之前,系统会调用onSaveInstanceState(Bundle outState)来保存View的状态,并到传入的outState对象中。

 
onRestoreInstanceState:
在Activity被重新创建时,会通过onCreate(Bundle
savedInstanceState)和onRestoreInstanceState(Bundle
savedInstanceState)传入保存的状态信息并恢复View的状态。(onCreate主要重建Fragment、onRestoreInstanceState恢复Window状态)

 
View控件的状态被保存需要满足两个条件:

1、View有唯一的ID;

2、View的初始化时要调用setSaveEnabled(true)

 
View控件恢复的注意三点:

1、如果id重复,则View的状态会被覆盖

2、被保存的Fragment会在onCreate中被自动创建和添加到FragmentActivity中

3、被保存的View不会被自动创建,只是通过id获取savedInstance用于更新View