文章目录
前言
这篇记录笔者在复习Activity生命周期及其拓展
一、常见生命周期
一般地,我们认为我们日常开发需要使用和了解的生命周期大致有如下六类
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestory()
我们一般通过是否可交互/可见/可存在来区分以上的生命周期
更详细的,结合一些常用的场景和方法,我们一般认为Activity的生命周期和其他方法有如下关系
二、生命周期具体分析
1.onCreate()
当Activity创建实例完成,并调用attach方法赋值PhoneWindow、ContextImpl等属性之后,调用此方法。该方法在整个Activity生命周期内只会调用一次。调用该方法后Activity进入ON_CREATE状态。
2.onStart()
onStart:当Activity准备进入前台时会调用此方法。调用后Activity会进入ON_START状态。
一般的,我们认为onStart()方法表示Activity进入了可见状态,但更为核心的理解是此时Activity出于返回栈的顶端这个方法一般用于从一个Activity切换回一个Activity或新Activity启动
3.onResume()
onResume:当Activity准备与用户交互的时候调用。调用之后Activity进入ON_RESUME状态。
此时的活动一定位于返回栈的栈顶,并且处于运行状态。
4.onPause()
onPause:当前activity窗口失去焦点的时候,会调用此方法。调用后activity进入ON_PAUSE状态,并进入后台。
我们通常会在这个方法中将一些及其消耗 CPU 的资源释放掉(比如显示地图或者大规模图形),以及保存一些关键数据(比如用户输入的数据等等),但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
5.onStop()
onStop:当activity不可见的时候进行调用。调用后activity进入ON_STOP状态。
6.onRestart()
7.onDestory()
onDestroy:当activity被系统杀死或者调用finish方法之后,会回调该方法。调用该方法之后activity进入ON_DESTROY状态。
三、引起生命周期的回调方法
onActivityResult
结合startActivityForResult一起使用。
具体地结合上面那张图这么分析
onSaveInstanceState/onRestoreInstanceState
这两个方法,主要用于在Activity被意外杀死的情况下进行界面数据存储与恢复。什么叫意外杀死呢?
onNewIntent
四、场景生命周期流程
正常启动
Activity切换
屏幕旋转
当因资源配置改变时,activity会销毁重建,最常见的就是屏幕旋转。这个时候属于异常情况的Activity生命结束。因而,在销毁的时候,会调用onSaveInstanceState来保存数据,在重新创建新的activity的时候,会调用onRestoreInstanceState来恢复数据。
后台应用被系统杀死
这个流程跟上面的资源配置更改是很像的,只是每个activity不可见的时候,会回调onSaveInstanceState提前保存数据,那么在被后台杀死的时候,就不需要再次保存数据了。
具有返回值的启动
五、常见的面试题提问
1、假设项目中有这样的需求,当指定的 Activity 在用户可见后才进行广播的注册,在用户不可见后对广播进行注销,那应该在哪两个回调中做这个处理呢?
注意可见和不可见,所以抓住onStart()和onStop()
2.如果有一些数据在 Activity 跳转时(或者离开时)要保存到数据库,那么你认为是在 onPause() 好还是在 onStop() 执行这个操作好呢?
要结合看数据重要性、数据操作耗时性
onPause()的优势在于更易于执行,毕竟可能Activity还没执行到onStop()就被回收
onStop()的优势在于存储的耗时操作不会影响下一个Activity
3.Activity A 启动了 Activity B,简单说下它们分别的生命周期的变化。
4.Activity A 通过 Intent 显示启动了 Activity B,当 B 处于可见状态后,A 是否一定会调用 onStop()?
这两题的常规思路上面的分析已经给出,但是要注意ActivityA不一定调用onStop()方法
比如Activity B是dialog形式的Activity,或者Activity B的不透明度被降低
总结
暂时就整理到这里,后续继续完善
Android全面解析之Activity生命周期
Android 面试:如何理解 Activity 的生命周期