Android开发:Activity生命周期

为了更好的学习和掌握Android开发技能,将对整个Android系统进行分析记录.萌新一枚,若有任何错误的地方望各位大佬指点纠正.

本篇主要分析Activity的生命周期,其生命周期分为两部分内容:
1.典型情况(Activity不受外部异常影响 正常完成生命周期)
2.异常情况(Activity被系统回收或设备Configuration发生改变)

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

Android内部对Activity生命周期的各个阶段进行响应,不同阶段调用不同的方法,先来一张看了又看的Activity生命周期图.

官方生命周期图

在逛技术贴的时候,还发现了一张更好解释生命周期的图.

生命周期金字塔图

详细解读每个方法的调用场景

  • onCreate:
    该方法在Activity创建时被调用,可以进行一些数据的初始化及加载界面布局资源等.该方法在一个Activity的生命周期内只会执行一次.

  • onRestart:
    该方法只有在目标Activity执行完onStop方法后回到前台时调用即跳出不可见不可交互状态转为可见进一步变为可见可交互状态.onRestart方法执行完后紧跟着onStart方法.

  • onStart:
    该方法表示Activity正在被启动,处于可见状态,但不能交互,还未出现在前台.

  • onResume:
    该方法表示Activity已处于可见可交互状态,此状态下用户可进行交互动作.
    需要注意的是onStart和onResume两个方法都表示Activity处于可见状态,但只有调用onResume方法后activity才显示到前台与用户交互.

  • onPause:
    该方法表示Activity正在停止,处于可见不可交互状态.正常情况下在调用onPause后紧跟着执行onStop方法.
    如果调用onPause方法后Activity快速回到前台就会直接执行onResume方法.
    如果系统内存紧张执行GC时也有可能会回收处于onPause状态下的 Activity.
    需要注意的是onPause方法中仅可以做一些不耗时的回收或存储数据工作,因为新Activity显示需要前一个Activity执行完onPause方法后才会执行onResume方法.

  • onStop:
    该方法表示Activity正在停止,处于不可见不可交互状态.可以在此方法中执行一些稍微重量级的回收工作,但仍不能太耗时.

  • onDestroy:
    该方法是Activity生命周期的最后一个方法,可以在此方法中执行重量级回收工作等.执行完该方法标志着此Activity已经销毁了.该方法在一个Activity的生命周期内只会执行一次.

  1. 启动一个Activity时执行 onCreate -> onStart -> onResume
  2. 当用户从本Activity打开新的Activity或切换到桌面或锁定屏幕时,执行 onPause -> onStop.注意当打开的Activity是个DialogActivity或透明背景时,原Activity仅执行onPause,处于可见不可交互状态.具体分析
  3. 当用户再次回到原Activity时,执行 onRestart -> onStart -> onResume
  4. 当用户点击back按键时,执行 onPause -> onStop ->onDestroy
  5. 从整个生命周期看onCreate和onDestroy对应,表示Activity的创建和销毁,在生命周期里仅能执行一次.onStart和onStop对应,表示Activity是否可见.onResume和onPause对应,表示Activity是否在前台,是否可交互.随着用户操作下面两对方法都会多次调用.

2.异常情况下的生命周期分析

本小节主要分析异常情况下Activity的生命周期变化,一般造成异常情况主要是系统配置改变或内存不足造成Activity被杀死.

2.1系统配置发生改变引起生命周期的异常变化

举个例子:开启手机的自动旋转后,当Activity从竖直状态转变为横屏时,系统会自动销毁原先的Activity并重建.如果我们不做特殊处理,那么每当系统配置改变时,我们的Activity都会销毁重建.如下图所示:

旋转手机Activity生命周期变化
  • 当我们将手机从竖屏转变为横屏时,可以看到原Activity执行 onPause -> onSaveInstanceState -> onStop -> onDestroy 走完原Activity的生命周期.

  • 当原Activity销毁后又会迅速的开启新的Activity执行 onCreate -> onStart -> onRestoreInstanceState -> onResume 最终新的Activity显示在用户界面上.

  • onSaveInstanceState 和 onRestoreInstanceState 两个方法仅在生命周期异常情况下执行,前者主要是对异常销毁的Activity进行一些数据保存,后者主要是对存储的数据进行恢复,数据存取都是通过Bundle,因此我们可以在Bundle中附加个人数据进行读写.经过测试onSaveInstanceState在onStop前调用,onRestoreInstanceState在onStart方法后调用.这两个方法执行的过程中,系统会自动对视图进行信息数据的存取,例如:ListView的滚动位置等等.

2.2内存不足引起生命周期的异常变化

这种情况下数据的存取和上一小节完全一致.内存不足引起Activity被回收,主要还是其优先级过低造成的.一般情况下对Activity是否回收分为一下三种优先级,从高到低排序:

  1. 前台Activity(可见可交互状态),优先级最高.
  2. 可见不可交互的Activity,例如上面弹出一个对话框等,使得Activity无法和用户交互.
  3. 后台Activity(不可见不可交互状态),已经暂停的Activity,优先级最低

当系统内存不足时,系统会按优先级去杀死进程,并通过 onSaveInstanceState 和 onRestoreInstanceState 两个方法来存储和恢复数据.如果一个进程中没有四大组件在执行,那么该进程将很快被系统杀死,因此,一些后台工作不适合脱离四大组件而独立运行在后台中,这样进程若有被杀死.比较好的方法是将后台工作放到Service中从而保证进程有一定优先级,这样就不会被轻易的杀死.

通过上述分析,我们知道当系统配置改变时会时Activity销毁重建.通过在AndroidMainManifest.xml中为Activity添加configChanges属性去避免Activity的销毁重建.configChanges的属性有很多例如:orientation(屏幕方向变化)、KeyboardHidden(虚拟键盘可访问性变化)等,通过设置这些属性后当运行过程中发生上述情况Activity不会销毁重建也不会调用 onSaveInstanceState 和 onRestoreInstanceState 两个方法,取而代之的是执行onConfigChanged方法,我们可以在其中做些特殊处理.

configChanges添加orientation后效果

总结

本篇分析Activity的正常生命周期以及异常状态下的生命周期变化,相信看完此篇后对其生命周期有了大致的了解.推荐大家去看下任玉刚大神的Android开发艺术探索,对于萌新来说会有很大的帮助.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容