Android 面试(二):如何理解 Activity 的生命周期

这是说好的 面试系列 的第二期。本期我们依然来探讨一些面试必考题。

往期内容传递:
Android 面试:说说 Android 的四种启动模式

说说 Activity 的生命周期吧

当我告诉你面试官会问这个问题的时候,你一定是「啪」,给我一耳光。这样的问题网上一搜一大堆,随便背诵一下就可以轻松面过,有必要这么大费周折地来听「南尘」吹一波吗?

nanchen

所以你开始背诵起来。

  • 启动 Activiy:onCreate => onStart() => onResume(), Activity 进入运行状态.
  • Activity 退居后台 ( Home 或启动新 Activity ): onPause() => onStop().
  • Activity 返回前台: onRestart() => onStart() => onResume().
  • Activity 后台期间内存不足情况下当再次启动会重新执行启动流程。
  • 锁屏: onPause() => onStop().
  • 解锁: onStart() => onResume().

干脆上张图,更清晰。


nanchen

咋一看还是挺清晰的,对,能背下来,甚至能把图在心里记下来确实不错。

但但是!!!

现在的面试官还会这样问你吗?

会!

对初级甚至是入门的 Android 开发工程师吧?

nanchen

不卖关子,那怎么问呢?

怎么问之前,我想分别解析下这些方法,帮助大家理解。注意其中我加粗的部分。

  • onCreate()
    每个活动中我们都重写了这个方法, 它会在活动第一次被创建的时候调用。 你应该在这个方法中完成活动的初始化操作, 比如说加载布局、绑定事件等。

  • onStart()
    这个方法在活动由不可见变为可见的时候调用。

  • onResume()
    这个方法在活动准备好和用户进行交互的时候调用。 此时的活动一定位于返回栈的栈顶,并且处于运行状态。

  • onPause()
    这个方法在系统准备去启动或者恢复另一个活动的时候调用。 我们通常会在这个方法中将一些及其消耗 CPU 的资源释放掉(比如显示地图或者大规模图形),以及保存一些关键数据(比如用户输入的数据等等),但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。

  • onStop()
    这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么 onPause() 方法会得到执行,而 onStop()方法并不会执行。

  • onDestroy()
    这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

  • onRestart()
    这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

对官方代码感兴趣的童鞋可以去翻阅源码,其中 Activity 单 onXXX 的回调方法 API 就高达八十多种,单纯记忆下来根本没用。额,可能有用,你可以为你超强的记忆力感到骄傲和自豪!

上面的几种方法除了 onRestart() 以外,都两两相对,我们又可以分为三个时期。

  • 完整生存期
    活动在 onCreate()方法和 onDestroy() 方法之间所经历的,就是完整生存期。一般情况下,一个活动会在 onCreate() 方法中完成各种初始化操作,而在 onDestroy() 方法中完成释放内存的操作。

  • 可见生存期
    划重点!!!这个问题我就在面试中遇到了,其实我知晓这个题,怎奈误解了面试官的意思答非所问了。活动在 onStart() 方法和 onStop() 方法之间所经历的,就是可见生存期。在可见生存期内, 活动对于用户总是可见的, 即便有可能无法和用户进行交互。 我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在 onStart() 方法中对资源进行加载,而在 onStop() 方法中对资源进行释放, 从而保证处于停止状态的活动不会占用过多内存。

  • 前台生存期
    活动在 onResume() 方法和 onPause() 方法之间所经历的,就是前台生存期。在前台生存期内, 活动总是处于运行状态的, 此时的活动是可以和用户进行相互的, 我们平时看到和接触最多的也这个状态下的活动。

到底怎么问?

说了这么多,不妨我们可以模拟几种面试官的询问场景。

1、假设项目中有这样的需求,当指定的 Activity 在用户可见后才进行广播的注册,在用户不可见后对广播进行注销,那应该在哪两个回调中做这个处理呢?

2、如果有一些数据在 Activity 跳转时(或者离开时)要保存到数据库,那么你认为是在 onPause() 好还是在 onStop() 执行这个操作好呢?

3、Activity A 启动了 Activity B,简单说下它们分别的生命周期的变化。

4、Activity A 通过 Intent 显示启动了 Activity B,当 B 处于可见状态后,A 是否一定会调用 onStop()?

首先第一个问题,我们认真看了上面的解释的童鞋肯定都比较清楚。问题中强调了「可见」和「不可见」,所以我们只需要注重可见生命周期,在Activity 启动后,会先调用 onCreat() 方法进行布局和想关事件的绑定,直到回调 onStart() 方法后活动才可见,所以直接回答 onStart()onStop() 即可。

第二个问题,熟悉 Activity 的生命周期的我们都知道,onPause() 相比 onStop() 更容易触发。而「数据」就是 APP 甚至互联网产品的根,我们虽然绝大多数情况下都会遵从 onPause() => onStop() 的原则,但我们实在难以保证每次运行都能正常运行到 onStop() 方法,比如还没运行到 onStop() 系统就被回收了。

值得注意的是,这个操作要尽量地快,不然肯定会影响到下一个 Activity 的生命周期的。

第三个和第四个问题其实考察的点基本一致,大概就想考察面试者是否认为只要最上层栈顶的 Activity B 处于可见状态,那下面一层的 Activity A 就一定会调用 onStop() 方法。

如果直接照第四个问题的方式提问你,你就算认定一定会调用,但你也会被问的怀疑人生。但由于你觉得一定调用 onStop() 方法,并且你也找不到不调用的情况,所以你很耿直的回答了一定会调用。

实际上却并不是一定会调用,我们上面也说了,Activity 调用 onStop() 的时期是该 Activity 处于完全不可见状态,所以我们只需要想办法举出还可见的状态就好了。

我们假设弹出一个对话框形式的 Activity B,甚至就算弹出一个正常的 Activity B,把 B 的页面设置较低的透明度,实际上是一样的效果,不信你去打印日志试试。

上面提到了数据存储要放在 onPause() 比较好,那么无论什么数据的保存都放在 onPause() 可行吗?

哈哈,之前我也是认为是正确的,直到今天。

假设部分数据是非常重要的,我们需要在各种情况都要考虑到存储起来,我之前也是用 onPause() 生命周期做的处理。

可当我直接关闭电源,再重启的时候数据直接不见了!!!

想来也是应该的,直接关掉电源,谁还管你的 Activity 生命周期呢?最后我把重量级的数据存储放在了当数据发生变动(一些人为操作,或从服务器获取)的时候进行数据存储。

小结

Activity 的生命周期好像我们平时没怎么注意,因为觉得一切好像理所当然,但成功在于每一个细节,运用得当 Activity 的生命周期,让你的应用更加畅行无阻。

咦,一转眼都快到凌晨了,最近笔者的工作也是忙的飞起。但还是要马不停蹄地装逼,你看,「stormzhang」靠装逼帮公司融资 XXX 万,说明装逼就是有效果的。

nanchen

做不完的开源,写不完的矫情。欢迎扫描下方二维码或者公众号搜索「nanchen」关注我的微信公众号,目前多运营 Android ,尽自己所能为你提升。如果你喜欢,为我点赞分享吧~


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

推荐阅读更多精彩内容