详解Android Activity生命周期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解Android Activity生命周期相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

 

技术分享

 

(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"):

技术分享

 

 

  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

 













以上是关于详解Android Activity生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Android之Activity生命周期详解

Activity详解生命周期(Android)

Android 中Activity和Fragment生命周期的具体变化详解

Activity生命周期详解

Activity生命周期详解

AndroidActivity生命周期研究