• Activity的生命周期


    Activity的生命周期分为两个部分:

      (1)典型情况下的生命周期

      (2)异常情况下的生命周期

    一.典型情况下的生命周期分析

      所谓的典型情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变。
      下面官方Activity的生命周期的一张图,很详细,自己看。

    1.现在就介绍下这生命周期中的几个方法。

     onCreate()

     这个方法在Activity启动的时候回调。

     在这个方法中我们可以做一些初始化的操作,比如调用setContentView去加载界面布局资源、初始化Activity所需的数据。   

     onStart()

     这个方法在Activity可见的时候回调。

       此时Activity可见但是还没有出现在前台,无法和用户进行交互。

     onResume()

     这个方法在Activity获得焦点的时候回调。此时Activity才显示到前台。

     onPause()

     这个方法在Activity失去焦点的时候回调。

     此时可以做一些存储数据、停止动画等工作,但是注意不要太耗时,因为这会影响到新Activity的显示,onPause()必须先执行完,新的  Activity的onResume()才执行。

     onStop()

     这个方法在Activity不可见的时候回调。

     onRestart()

     这个方法在Activity由停止状态到运行状态时会回调此方法。

     onDestroy()

     这个方法在Activity销毁时会回调。

       我们可以做一些回收工作和最终资源的释放。

      

    2.下面介绍几个过程。

      (1)界面从"不存在" -->"可见可操作"

       onCreate()---onStart()---onResume()

      (2)界面从"可见可操作" --->"不存在" (Back键)

       onPause()---onStop()---onDestroy()

      (3)界面从"可见可操作"--->"不可见,但存在" (Home键)

       onPause()---onStop()  

      (4)界面从"不可见,但存在"--->"可见可操作" (Home键之后又打开那个Activity)

       onRestart()---onStart()---onResume()

      (5)界面从"可见可操作" --->"可见不可操作" (Activity被遮盖一部分,或者完全遮盖但是上面Activity是透明的)

          onPause()

      (6)界面从"可见不可操作"--->"可见可操作"

       onResume()

       

    3.Activity的四种状态

     在 android 中,Activity 拥有四种基本状态。

      (1)Active/Running状态

        一个新Activity启动入栈后,它在屏幕的最前端,栈的最顶端,此时它处于可见并可和用户交互的激活状态。 

     (2)Paused状态

        当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它仍然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见是它已经失去了焦点,故不可与用户交互。

     (3)Stopped状态

        当Activity被另一个Activity覆盖,失去焦点并不可见时处于Stopped状态。

     (4)Killed状态 

        当Activity被系统杀死回收或者没有被启动时处于Killed状态。

      当一个 Activity 实例被创建、销毁或者启动另外一个 Activity 时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作。

     

     4.Activity栈

       Android是通过一种Activity栈的方式来管理Activity的,一个Activity的实例的状态决定它在栈中的位置。处于前台的Activity总是在栈的顶端,当前台Activity因为异常或者其他原因被销毁时,处于第二层的Activity将被激活,上浮到栈顶。当新的Activity启动入栈时,原Activity会被压入到栈的第二层。一个Activity在栈中的位置变化反映它在不同状态间的转换。Activity 的状态与它在栈中的位置关系如下图所示。

       

      如上所示,除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。

     5.相关问题

      Question1: onStart和onResume、onPause和onStop从描述上看起来差不多,对我们来说有什么实质上不同?

      Answer: onStart和onResume是从Activity是否可见这个角度来回调的;

               onPause和onStop是从Activity是否在前台这个角度来回调的。

      Question2: 假设当前Activity为A,如果用户打开了一个新的Activity B那么B的onResume和A的onPause哪个先执行?

      Answer: Android官方文档对onPause解释有这么一句:不能在onPause中做重量级的操作。即必须onPause执行完之后新的Activity才能Resume.onPause和onStop都不能执行耗时的操作尤其是onPause,意味着我们尽量在onStop中做操作从而使新的Activity尽快显示出来。

    二、异常情况下Activity的生命周期分析

      所谓的异常情况下Activity的生命周期指的是:Activity被系统回收或者由于当前设备的Configuration发生变化导致Activity被销毁重建。

     1.资源相关系统配置发生变化导致Activity被杀死并重新创建

      比如当前Activity处于竖屏状态,当我们突然旋转屏幕,由于系统配置发生了变化,默认情况下Activity就会被销毁并且重新创建,当然我们也可以阻止系统重新创建我们的Activity。

       (1)不设置Activity的android:configChanges时 切屏会重新调用各个生命周期,默认会先销毁当前Activity,然后重新加载一遍。

       onPause()--->onSaveInstanceState()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()

         当系统配置发生变化时,Activity会被销毁,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState()来保存当前Acticity的状态,它是在onStop之前调用的,但是它和onPause没有先后顺序,需要说明这个方法只会出现在Activity被异常终止的情况下,正常系统是不会回调这个方法的。当Activity被重新创建后系统会调用onRestoreInstanceState()并且把销毁时onSaveInstanceState()保存的Bundle对象作为参数同时传递给onRestoreInstanceState()和onCreate()方法。我们可以在这两个方法来判断是否Activity被重建了,如果被重建,我们可以取出之前保存的数据并恢复。


        (2)设置Activity的android:configChanges="keyboard|orientation|screenSize"

            切屏不会重新调用各个生命周期,只会执行onConfigurationChanged()方法。

  • 相关阅读:
    JAVA闰年测试与解决非法输入
    Junit介绍与实现
    等价类划分方法的应用
    使用Visual Studio 2013进行UI自动化测试
    简谈软件测试
    【Software Project Management】Quizs
    White box testing
    peer review
    闰年问题
    热烈庆贺清明小长假的到来
  • 原文地址:https://www.cnblogs.com/yangang2013/p/4921943.html
Copyright © 2020-2023  润新知