[Lesson7] Activity生命周期

为了在Activity生命周期的各个阶段之间导航转换,Activity类提供六个核心回调:onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()。当Activity进入新状态时,系统会调用其中每个回调。
https://ithelp.ithome.com.tw/upload/images/20210831/20129566HcuX75VhcZ.png
onCreate():
您必须实现此回调,它会在系统首次创建Activity时触发。Activity会在创建後进入“已创建”状态。在onCreate()方法中,您需执行基本应用启动逻辑,该逻辑在Activity的整个生命周期中只应发生一次。例如:onCreate()的实现可能会将数据绑定到列表,将Activity与ViewModel相关联,并实例化某些类作用域变量。此方法会接收savedInstanceState参数,後者是包含Activity先前保存状态的Bundle对象。如果Activity此前未曾存在,Bundle 对象的值为null。
如果您有一个生命周期感知型组件与您的Activity生命周期相关联,该组件将收到ON_CREATE事件。系统将调用带有 @OnLifecycleEvent注释的方法,以使您的生命周期感知型组件可以执行已创建状态所需的任何设置代码。
onCreate()方法完成执行後,Activity进入“已开始”状态,系统会用onStart()和onResume()方法。

onStart():
当Activity进入“已开始”状态时,系统会调用此回调。onStart()调用使Activity对用户可见,因为应用会为 Activity进入前台并支持互动做准备。例如:应用通过此方法来初始化维护界面的代码。
当Activity进入已开始状态时,与Activity生命周期相关联的所有生命周期感知型组件都将收到ON_START事件。
onStart()方法会非常快速地完成,并且与“已创建”状态一样,Activity不会一直处於“已开始”状态。一旦此回调结束,Activity便会进入“已恢复”状态,系统将调用onResume()方法。

onResume():
Activity会在进入“已恢复”状态时来到前台,然後系统调用onResume()回调。这是应用与用户互动的状态。应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一个Activity,或设备萤幕关闭。
当Activity进入“已恢复”状态时,与Activity生命周期相关联的所有生命周期感知型组件都将收到ON_RESUME事件。这时,生命周期组件可以启用在组件可见且位於前台时需要运行的任何功能,例如启动相机预览。
当发生中断事件时,Activity进入“已暂停”状态,系统调用onPause()回调。
如果Activity从“已暂停”状态返回“已恢复”状态,系统将再次调用onResume()方法。因此,您应实现onResume(),以初始化在onPause()期间释放的组件,并执行每次Activity进入“已恢复”状态时必须完成的任何其他初始化操作。
无论您选择在哪个构建事件中执行初始化操作,都请务必使用相应的生命周期事件来释放资源。如果您在收到ON_START事件後初始化某些内容,请在收到ON_STOP事件後释放或终止相应内容。如果您在收到ON_RESUME事件後初始化某些内容,请在收到ON_PAUSE事件後将其释放。

onPause():
系统将此方法视为用户将要离开您的Activity的第一个标志(仅管这并不总是意味着Activity会被销毁);此方法表示 Activity不再位於前台(仅管在用户处於多窗口模式时Activity仍然可见)。使用onPause()方法暂停或调整当Activity处於“已暂停”状态时不应继续(或应有节制地继续)的操作,以及您希望很快恢复的操作。
您还可以使用onPause()方法释放系统资源、传感器(例如GPS)手把,或当您的Activity暂停且用户不需要它们时仍然可能影响电池续航时间的任何资源。
onPause()执行非常简单,而且不一定要有足够的时间来执行保存操作。因此,您不应使用onPause()来保存应用或用户数据、进行网路调用或执行数据库事务。因为在该方法完成之前,此类工作可能无法完成。相反,您应在onStop()期间执行高负载的关闭操作。
onPause()方法的完成并不意味着Activity离开“已暂停”状态。相反,Activity会保持此状态,直到其恢复或变成对用户完全不可见。如果Activity恢复,系统将再次调用onResume()回调。如果Activity从“已暂停”状态返回“已恢复”状态,系统会让Activity实例继续驻留在内存中,并会在系统调用onResume()时重新调用该实例。在这种情况下,您无需重新初始化在任何回调方法导致Activity进入“已恢复”状态期间创建的组件。如果Activity变为完全不可见,系统会调用onStop()。

onStop():
如果您的Activity不再对用户可见,说明其已进入“已停止”状态,因此系统将调用onStop()回调。例如,当新启动的 Activity覆盖整个营幕时,可能会发生这种情况。如果Activity已结束运行并即将终止,系统还可以调用onStop()。
当Activity进入已停止状态时,与Activity生命周期相关联的所有生命周期感知型组件都将收到ON_STOP事件。这时,生命周期组件可以停止在组件未显示在萤幕上时无需运行的任何功能。
在onStop()方法中,应用应释放或调整在应用对用户不可见时的无用资源。例如,应用可以暂停动画效果,或从精确位置更新切换到粗略位置更新。使用onStop()而非onPause()可确保与界面相关的工作继续进行,即使用户在多窗口模式下查看您的Activity也能如此。
您还应使用onStop()执行CPU相对密集的关闭操作。例如,如果您无法找到更合适的时机来将信息保存到数据库,可以在onStop()期间执行此操作。
当您的Activity进入“已停止”状态时,Activity对象会继续驻留在内存中:该对象将维护所有状态和成员信息,但不会附加到窗口管理器。Activity恢复後,Activity会重新调用这些信息。您无需重新初始化在任何回调方法导致Activity进入“已恢复”状态期间创建的组件。
进入“已停止”状态後,Activity要嘛返回与用户互动,要嘛结束运行并消失。如果Activity返回,系统将调用onRestart()。如果Activity结束运行,系统将调用onDestroy()。

onDestroy():
销毁Ativity之前,系统会先调用onDestroy()。
当Activity进入已销毁状态时,与Activity生命周期相关联的所有生命周期感知型组件都将收到ON_DESTROY事件。这时,生命周期组件可以在Activity被销毁之前清理所需的任何数据。
您应使用ViewModel对象来包含Activity的相关视图数据,而不是在您的Activity中加入逻辑来确定Activity被销毁的原因。如果因配置变更而重新创建Activity,ViewModel不必执行任何操作,因为系统将保留ViewModel并将其提供给下一个Activity实例。如果不重新创建Activity,ViewModel将调用onCleared()方法,以便在Activity被销毁前清除所需的任何数据。
您可以使用isFinishing()方法区分这两种情况。
如果Activity即将结束,onDestroy()是Activity收到的最後一个生命周期回调。如果由於配置变更而调用onDestroy(),系统会立即新建Activity实例,然後在新配置中为新实例调用onCreate()。
onDestroy()回调应释放先前的回调(例如onStop())尚未释放的所有资源。

参考资料:https://developer.android.com/guide/components/activities/activity-lifecycle?hl=zh-cn
谢谢大家愿意花时间阅读,小弟弟我在此鞠躬/images/emoticon/emoticon41.gif


<<:  30天轻松学会unity自制游戏-制作Boom

>>:  全端入门Day22_後端程序撰写之Node.js

[Day 30] 使用TensorFlow.js建置DNN手写数字辨识分类器

使用TensorFlow.js建置DNN手写数字辨识分类器 不能观看的话可以点选连结: https:...

ISO 27001 资讯安全管理系统 【解析】(十七)

柒、第六章 风险管理 这个章节是ISO标准设置来取代以前「预防措施」的概念,在条文中首先强调的是风险...

30个实用网路行销工具(2020),从Google SEO、FB社群行销再到网站分析

这个实用网路行销工具系列文,整理我平常研究的各项Digital Marketing Tools,帮助...

op.26 《全领域》-全域开发实战 - 居家植物盆栽 Mvt I (NodeMCU & MQTT)

op.26 打造属於你的时空廊道 为你我打造一个专属你的自由往返通道 让你可以任意地穿越 不再受拘...

铁人赛 Day2 -- SQL到底是什麽东西?讲中文好不好

SQL到底是什麽东西? 全名叫做"结构化查询语言(Structured Query Lan...