探索Activity之生命周期

作为一个Android应用开发人员, 自不必说, Activity是我们应用的门面, 我们90%的工作都围绕它进行, 用它来呈现内容, 用它来与用户交互...

那么我们真的了解Activity吗? 它到底怎么来, 又怎么没的呢? 它是怎么加载布局, 怎么呈现内容的呢? 它们之间是如何交互的呢??? 太多的问题.

让我们先从Activity的生命周期开始我们的探索之旅吧.

1, 疑问

  1. Activity生命周期回调有哪些? 分别对应做什么?
  2. Back和Home键退出Activity有什么区别?
  3. 切换屏幕会发生什么? 怎么处理?
  4. 从Activity A启动Activity B会发生什么? 再从B启动A呢?

2, 探索

带着这些疑问, 开始我们的探索吧.
首先, 我们根据官方文档中的Activity生命周期图:

activity_lifecycle

写一个简单的Demo程序, 有AActiviy和BActivity两个Activity, 分别都有两个按钮, 启动A和B. 然后在二者的各个生命周期和其他对外回调中加上log信息. 做如下几个实验, 查看log输出.

Demo源码已上传github, 源码地址.

以下实验中, AActivity和BActivity的启动模式均为标准模式. 关于launch mode, 后续会结合task和back stack来一起探索.

2.1, 正常启动Activity, Back退出, 再回来

首先, 我们看下正常启动AActivity的log输出:


可以看出果然如lifecycle图所示, onCreate -- onStart -- onResume 的线路创建了一个新的AActivity实例 AActivity@429ea620.

Back退出:


点击back键时, 依照 onPause -- onStop -- onDestroy 的顺序AActivity@429ea620销毁了.

注意: 退出时并没有调用onSaveInstanceState.

再回来:


很明显, 是一个新的AActivity实例AActivity@4295cd70创建了.

2.2, Home退出, 再回来

点击Home键的log输出:


没有onDestory, 且调用了onSaveIInstanceState.

再回来:


因为没有销毁, 所以再次进入时走restart流程, onRestart -- onStart -- onResume.

2.4, 旋转屏幕

我们旋转以下手机屏幕看看会发生什么:


可以看到AActivity销毁重建了~~

注意: 这里在销毁重建的过程中, 销毁时调用了onSaveInstanceState, 而重建时调用了onRestoreInstanceState.

我们在manifest文件中给AActivity加上configChanges属性:

<activity
    android:name=".lifecycle.AActivity"
    android:label="A-Activity"
    android:configChanges="orientation|keyboardHidden|screenSize">
</activity>

再试下:


请忽略AActivity的hash码. 可以看到这次AActivity在转屏时并没有重建, 而是调用了onConfigurationChanged.

2.5, A, B之间的切换

1, 从A发起一个Intent启动B


1, 新启动了一个BActivity的实例.
2, AActivity的onPause之后才开始启动BActivity.
3, BActivity的onResume之后, AActivity才调用onStop.

2, 从B再发起一个Intent启动A


会再新建一个AActivity的实例, 而非使用原来的实例(因为我们的launch mode是默认的标准模式).
流程和A启动B完全一样.

3, 从B按Back键到A


1, AActivity@429dadb0重启了
2, BActivity销毁了.
3, 和A启动B类似, B onPause之后A 重启, A重启完onResume之后, B onStop -- onDestroy.

结论

  1. Activity的生命周期如官方图所示, 从onCreate -- onStart -- onResume 创建, 对应onPause -- onStop -- onDestory销毁.

  2. 这六个关键回调构成三个区间:

    • 完整生命期: onCreate -- onDestory
    • 可见周期: onStart -- onStop
    • 可操作周期: onResume -- onPause
  3. Back键会销毁Activity, Home键Activity会进入Stop状态.

  4. onSaveInstanceState和onRestoreInstanceState不是生命周期回调, 不是必须调用的.

  5. 可以理解为onSaveInstanceState是系统认为可能会因为内存不够或是Configuration改变等销毁Activity时用来存储Activity状态的, 故而在Back键销毁时Activity并不会调用onSaveInstanceState, 因为系统认为这是用户主动销毁的.

  6. 对于转屏的处理, 我们可以在onSaveInstanceState和onRestoreInstanceState中处理Activity重建的状态恢复. 或是配置configChanges属性, 在onConfigurationChanges处理Configuration变化.

  7. 从A启动B时(或者说Activity切换时), 是A的onPause执行完, 才会开始B的onCreate, 所以要避免在onPause回调中执行耗时操作, 以免切换不流畅.


以上的生命周期分析, 实际上是Activity的较为简单的表现, 实际场景中会结合Activity的launch mode, taskAffinity, activity属性, Intent flag等综合考虑.

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

推荐阅读更多精彩内容