Android中Activity生命周期的深度剖析

来源:互联网 发布:哔咔用啥番茄软件好? 编辑:程序博客网 时间:2024/04/29 05:06

Android中Activity生命周期的深度剖析

activity生命周期的简单知识汇总

  • 之前我曾经写过一篇很简单的关于activity生命周期的博客,如果读者有这样的需求的话可以点击下面进行查看。activity的简单生命周期的介绍

activity生命周期的深度介绍与剖析

  • onStart和onResume,onPause和onStop的区别

    • 从描述上来看,这两组方法的功能差不多一样,那么它们的具体的差别在哪里呢?

      • 其实onStart和onResume、onPause和onStop看起来确实差不多,甚至我们可以保留它们其中的一对就好,但是android系统为什么还要提供这种看上去重复的方法呢?

        其实这样安排主要是表示着不同的意义而已,onStart和OnStop是从activity是否可见这个角度来分析的;onResume和onPause是从activity是否在前台这个角度来分析的,除了这种差别之外在使用上没有任何差别。

  • 异常情况下activity的生命周期分析

    上面我们讲了正常情况下的activity的生命周期的简单介绍,下面我们来了解下在异常情况下activity的生命周期的变化。那么哪些情况会出现异常呢?例如系统的配置发生改变、系统的内存不足导致后台的activity会被系统杀死等等情况,比较常见的就是以上这两种,我们现在来分析下。

    1. 资源相关的系统配置发生改变导致activity的销毁以及重建

      说一个常见的例子:手机当前如果处于竖屏状态(activity也是竖屏状态),如果突然屏幕旋转,由于系统配置发生了改变,在默认的情况下activity会被销毁并且会重新创建。

      当系统的配置发生改变之后,activity会被销毁,它的onPause、onStop、onDestory会依次被调用。但是因为activity是在异常情况下被销毁的,所以系统会调用onSaveInstanceState来保存当前activity的状态。这个方法的调用时间是在onStop之前,和onPause之间没有明确的前后关系,可以在onPause之前也可以在onPause之后进行调用。需要说明的是这个方法只是会在异常情况下才会被调用,正常的生命周期状态下是不会调用该方法的。

      下面我们通过一个流程图来了解下这个过程:
      这里写图片描述
      在onSaveInstanceState和onRestoreInstanceState方法中系统帮我们做了一定的恢复工作,当activity在异常情况下需要重建时,系统会默认帮我们保存当前activity的视图结构,并且在activity重启之后帮我们恢复这些数据:例如文本框的输入的数据、listview滚动的位置等等…需要特别说明一点的是:系统只有在activity被销毁并且还有机会重新展示的情况下才会调用该方法进行保存数据,其他情况下是不会调用该方法的。

      上面说道activity在进行恢复的时候,会将保存的bundle对象当做形参传入到onRestoreInstanceState和onCreate方法中,实际上这两个方法是有差别的:

      1. onRestoreInstanceState方法一旦被调用,那肯定是说明了activity是处于异常情况下的重启行为,它的bundle形参肯定是有值的,我们不需要额外的判断该形参是否为空。
      2. 但是onCreate方法却不行,onCreate方法如果是正常启动的情况下其形参的bundle对象是空的,所以我们需要额外的判断该对象是否为空。因此官方建议是让大家使用onRestoreInstanceState方法来恢复保存的数据。

      那么我们如果不想在系统配置发生改变的时候进行销毁activity并重建的过程的话,我们该怎么做呢?

      其实,android系统中可以通过配置某些属性来达到以上的目的,我们可以给activity设置configChanges属性来达到这种目的,比如就拿屏幕旋转来说明:

      如果我们不想让activity在屏幕旋转的时候重新创建,我们就可以给configChanges属性添加orientation这个值:

      <activity    android:name=".MainActivity"    android:configChanges="orientation">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>

      如果我们还想指定更多的属性,我们可以使用“|”链接起来,系统配置中所含的项目是非常多的,详细的请看下图(常用的有:locale、orientation、keyboardHidden):
      这里写图片描述

      通过以上配置的说明,我们就可以看到如果我们不在AndroidManifest.xml文件中设置activity属性的话,当相应的配置发生了改变就会导致activity的重新创建。

    2. 资源内存不足,导致的低优先级的activity被系统杀死

      我们先来了解下activity的优先级的情况

      1. 前台activity:正在和用户进行交互的activity,优先级最高

      2. 可见但是非前台activity:例如activity弹出了一个对话框,导致activity可见,但是在后台没办法和用户进行交互

      3. 后台activity:已经被暂停的activity,用户完全看不到它,优先级最低。

      当系统的内存不足的时候,系统会按照上面说的优先级的顺序去杀死activity所在的进程,并会使用onSaveInstanceState和onRestoreInstanceState方法来存储和恢复数据。当然如果在一个进程中没有android的四大组件进行运行的话,这个进程会很快地被系统杀死。所以一些比较重要的后台工作需要借助于四大组件中的service来运行,从而保证了该进程中一定的优先级,这样就不会被系统过早的干掉。

0 0