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

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

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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 饭卡消磁了怎么办妙招 有好项目没资金怎么办 买的股票涨停了怎么办 考研没过国家线怎么办 中石化的油卡怎么办 5173号被找回了怎么办 谭木匠梳子断了怎么办 198地块上的企业怎么办 天猫投诉不成立怎么办 顾客老嫌瓷砖贵怎么办 公司的公章丢了怎么办 物业不给充电费怎么办 怎么办社保卡去哪里办 单位没给社保卡怎么办 诈骗链接点开了怎么办 私人老板拖欠工资不给怎么办 辞职了工资不发怎么办 老板欠工资不给怎么办 投资平台跑路了怎么办 眼镜太松往下滑怎么办 塑胶水管管断了怎么办 淘宝排名靠后了怎么办 我有古董想出售怎么办 被拍卖公司骗了怎么办 苹果4s铃声太小怎么办 新号码注册微信怎么办 uc不能下种子了怎么办 刚出生的小牛喘怎么办 回奶之后有硬块怎么办 回奶第十天硬块怎么办 断奶期间乳房有硬块怎么办 断奶后乳房有肿块怎么办 北京一证通到期怎么办 没做过后勤的人怎么办 别样app被税了怎么办 人肉代购被税了怎么办 网易考拉被税了怎么办 家住乐清被税了怎么办 糖耐结果高了怎么办 35岁之后死档案怎么办 档案被自己拆了怎么办