【Android】Activity 生命周期(详细介绍)

2025-04-28 0 807

【Android】Activity 生命周期(详细介绍)

刚开始学习Android开发,因此最近研究了一下Android中Activity的生命周期。

一、什么是Activity?

介绍

在安卓(Android)开发领域中,Activity(活动)是一个非常重要的概念,以下是关于它的详细介绍。

Activity 是安卓应用中用于实现用户界面的一个组件,它提供了一个可视化的屏幕,用户可以在这个屏幕上进行各种交互操作,比如点击按钮、输入文本、滑动屏幕等。简单来说,每一个 Activity 通常对应着应用中的一个单独的屏幕内容。

作用

(1)构建界面展示内容

它负责加载和展示界面布局资源,通过 XML 布局文件或者代码动态创建视图元素,将各种 UI 控件(如文本框、按钮、列表等)按照设计要求呈现给用户,让用户直观地看到并使用应用所提供的功能。

(2)处理用户交互

当用户在 Activity 所展示的界面上进行操作时,例如点击某个按钮,相应的 Activity 能够捕获到这些操作事件,并执行预先定义好的代码逻辑来响应用户行为,比如跳转到另一个 Activity、更新界面显示内容或者执行后台计算等。 

二、Activity生命周期

所谓生命周期,是 Activity 从始至终(从创建到被销毁以及系统收回其资源)可以处于的一组状态。

当用户在应用中的 Activity 之间导航(以及进入和退出应用)时,这些 activity 都会在它们生命周期的不同状态之间转换。

为了在 Activity 生命周期的各个阶段之间导航转换, Activity 类提供七个核心回调集: `onCreate()`, `onStart()`, `onResume()`, `onPause()`, `onStop()`, `onDestroy()`和`onReStart()`。当 activity 更改状态时,系统会调用关联的回调方法。

关于Activity重要的生命周期回调方法,谷歌官方有了一张非常重要的流程图,可以说是人人皆知。如下图所示,它形象地描述了Activity的整个生命周期。

【Android】Activity 生命周期(详细介绍)

相信不少朋友也已经看过这个流程图,也基本了解Activity生命周期的几个过程,我们就来说一说这几个过程。

【onCreate】

1. 调用时机:实例创建与属性赋值后

当一个 Activity 开始创建实例,并且完成了一些关键的底层属性赋值操作,比如将 PhoneWindow、ContextImpl等重要属性进行赋值之后,就会调用 onCreate 方法。这意味着在进入 onCreate 阶段时,Activity 已经完成了基础的准备工作,具备了进一步初始化和设置的条件。

PhoneWindow:是 Activity 用来管理窗口相关内容的类,负责加载布局等展现到屏幕上的实际窗口操作。

ContextImpl:是 Context 的一个具体实现类,Context 在安卓中提供了很多和应用环境相关的操作,像资源访问等,ContextImpl 承担着具体实现这些功能的任务。

2. 调用次数:只会调用一次

在整个 Activity 的生命周期里,从创建到最终销毁,onCreate 方法只会被调用一次。

它是 Activity 启动时的一个关键起始点,后续即使 Activity 经历各种状态变化(比如重新回到前台、屏幕旋转等情况),也不会再次触发这个方法的首次调用了,这保证了一些初始化操作只进行一次,避免重复初始化可能带来的问题。

3. 方法的重要性及常用操作

在安卓开发中,开发者与 Activity 的生命周期交互时,onCreate() 是最常用的回调方法之一。因为它提供了一个合适的时机,让开发者去进行很多重要的初始化工作。

(1)组件初始化示例

像 viewmodel,通常会在 onCreate() 中进行初始化创建,以便后续能在整个 Activity 的生命周期内正常使用它来管理数据。

viewmodel:是安卓架构组件中的一部分,用于管理和存储与界面相关的数据,遵循特定的生命周期,方便在配置变化等情况下保留数据,并且实现了数据与视图的分离,让代码结构更清晰。

再比如 textview(一个常见的用于展示文本内容的 UI 控件),在这里可以进行实例化、设置初始文本、样式等属性相关操作,使其能正确地在界面上展示内容。

(2)设置布局关键操作

setContentView 方法必须在 onCreate() 中调用,这个操作非常关键,它决定了 Activity 最终呈现给用户的界面样子。

通过传入对应的布局资源文件(一般是 XML 格式,定义了界面上各种 UI 控件的布局和样式等信息)或者通过代码动态创建视图的方式,来给 Activity 设置它的布局内容,后续用户看到的屏幕上的界面元素就是基于这个设置来展现的。

4. 参数含义及来源

(1)参数作用

onCreate() 方法接收一个 Bundle 类型的参数,这个参数的主要作用是保留之前状态的数据。

例如,如果 Activity 因为某些原因(像屏幕旋转,系统会销毁当前 Activity 实例然后重新创建一个新的来适配新的屏幕方向;或者后台应用由于内存紧张等情况被销毁,之后又回到前台需要重新创建)暂时被销毁了,并且预期一定会被重新创建,那么之前通过 onSaveInstanceState() 方法存储的数据就会通过这个参数传递回来,以便 Activity 能恢复到之前的状态,避免数据丢失,提供更好的用户体验。

(2)参数情况说明

如果是 Activity 第一次启动,也就是不存在之前的状态需要恢复时,这个参数就是空的,因为没有之前存储的数据需要传递进来。

5. 小结

总之,onCreate() 方法在 Activity 的生命周期里有着极其重要的地位,它为开发者提供了初始化界面、组件以及处理状态恢复相关数据的关键时机,正确地在这个方法中进行相应操作,对于保证 Activity 的正常运行以及良好的用户体验至关重要。

【onStart】

1. 调用时机与状态转变

(1)调用时机

当 Activity 准备进入前台时,系统就会调用 onStart 方法。

这个准备进入前台的过程,意味着 Activity 即将要在屏幕上呈现给用户或者已经处于可以与用户进行交互的前置状态了,但还没完全准备好接收用户的操作输入,它是 Activity 从创建后逐步走向前台可交互状态的一个中间环节。

(2)状态转变

一旦 onStart 方法被调用,Activity 就会进入 ON_START 状态,这是 Activity 生命周期里的一个特定阶段标识,表明它已经朝着前台展示和可交互的方向又迈进了一步。

2. 前台

前台 Activity 的唯一性

在安卓系统的运行机制中,一般情况下只有一个 Activity 处于前台,这个前台 Activity 是当前用户主要与之交互的界面,而其他的 Activity 相对而言就进入了后台。

这里的前后台概念和安卓中的 Activity 返回栈有着紧密的联系。

Activity 返回栈就像是一个存放 Activity 实例的容器,按照启动的先后顺序依次将 Activity 压入栈中,栈顶的 Activity 就是当前处于前台的那个,而栈中其他的 Activity 就是处于后台状态,等待被重新唤起或者按照一定规则处理(比如被销毁等)。

3. 方法的常见应用场景

切回 Activity 时调用

onStart 方法通常在从别的 Activity 切换回当前 Activity 的时候被调用。

例如,用户从当前应用的 Activity A 跳转到 Activity B 后,再通过返回操作或者其他触发条件回到 Activity A 时,Activity A 就会再次调用 onStart 方法,意味着它又要重新准备进入前台,恢复到可以与用户交互的活跃状态,开发者可以利用这个时机去做一些相应的准备工作,比如重新加载一些可能在后台被释放的资源等(不过更合适的一些资源加载操作可能会放在 onResume 方法中,具体要看实际需求)。

4. 小结

总之,onStart 方法在 Activity 的生命周期中是一个承上启下的关键环节,对于理解 Activity 如何从创建走向前台可交互状态、前后台状态的切换以及与返回栈的关系等安卓开发中的重要概念都有着重要意义,开发者需要准确把握其特点和应用场景来合理地进行代码逻辑编写。

【onResume】

1. 调用时机与状态转变

(1)调用时机

当 Activity 准备好与用户进行交互时,系统会调用 onResume 方法。这通常发生在 Activity 已经完成了创建、布局加载等前期准备工作,即将呈现在用户面前并等待用户操作的时刻。

(2)状态转变

调用 onResume 方法后,Activity 进入 ON_RESUME 状态,意味着它处于前台且可以接收用户的输入事件,如点击、滑动等操作。

2. onStart 与 onResume 的区别

onStart 方法主要用于区分 Activity 是处于后台还是前台。当 Activity 准备进入前台时,会调用 onStart 方法,但此时 Activity 可能还不能与用户进行交互。

onResume 方法则是区分 Activity 是否可交互的关键。只有当 Activity 进入 ON_RESUME 状态时,才真正可以接收用户的输入事件。

3. 常见使用场景

从其他 Activity 返回时

当弹出另一个 Activity 的窗口时,原 Activity 会进入 ON_PAUSE 状态,但仍然可见。

当用户再次回到原 Activity 时,就会回调 onResume 方法。在这个方法中,开发者可以进行一些需要在 Activity 可交互时执行的操作,如更新界面数据、重新启动动画等。

4. 小结

onResume 方法标志着 Activity 可以与用户进行交互,但在使用时需要注意第一次启动 Activity 时可能出现的界面未完全加载的情况。开发者可以根据 onResume 的调用时机,合理安排代码逻辑,提升用户体验。

【onPause】

1. 调用时机与状态转变

(1)调用时机

当当前 Activity 的窗口失去焦点的时候,系统就会调用 onPause 方法。

比如有以下几种常见情况会触发:

  • 是启动了另一个 Activity ,新的 Activity 准备要显示到前台了,此时当前正在显示的 Activity 窗口就会失去焦点。
  • 弹出了一个对话框(例如权限申请对话框等),这个对话框获取了焦点,使得原本处于前台可交互的 Activity 窗口失去焦点。

总之,只要是 Activity 窗口不再拥有焦点,就会触发该方法的调用。

(2)状态转变

一旦 onPause方法被调用,这个 Activity 就会进入 ON_PAUSE 状态,并且从逻辑上来说它开始进入后台了。

不过需要注意的是,这里进入后台并不意味着它马上就从屏幕上消失不见了,只是它的活跃程度、可交互性发生了改变,变成了相对后台的一种状态,为其他 Activity 进入前台让出机会。

2. 操作限制与原因

不能进行重量级操作

在 onPause方法中是不适合做重量级操作的。所谓重量级操作,比如加载大量数据、进行复杂的计算或者长时间的文件读写等耗时费力的操作。

因为这个方法是在界面切换的关键时机被调用,如果在这里执行这些耗时操作,就会导致整个界面切换过程卡顿,影响用户体验。

例如,当用户点击一个按钮要打开另一个 Activity 时,如果当前 Activity 在 onPause 阶段执行一个耗时好几秒的数据查询加载操作,那用户就会明显感觉到界面切换不流畅,新的 Activity 不能及时显示出来,所以要尽量保证 onPause 里执行的是快速完成的轻量级操作。

3. 常见使用场景

轻量级资源释放

它比较适合用于在界面进入后台时进行一些轻量级资源的释放操作。

例如,暂停一些正在播放的动画(动画的播放可能会占用一定的系统资源,暂时停止可以节省资源),或者取消一些正在进行的网络请求(如果这些请求对于当前 Activity 的后台状态不是必需的话)等,通过释放这些相对不太重要且占用一定资源的内容,来为系统节省资源,同时也不会因为操作耗时过长而影响界面切换的流畅性。

4. 小结

总之,onPause 方法在 Activity 的生命周期里扮演着重要角色,把握好它的调用时机、操作限制以及所体现的可见性与可交互性等特点,对于合理管理 Activity 资源、优化界面切换体验以及深入理解安卓应用的运行机制都有着关键意义。

【onStop】

1. 调用时机与状态转变

(1)调用时机

当 Activity 真正达到严谨意义上的不可见时,系统就会调用 onStop 方法。

这里强调的 “严谨意义上的不可见”,是与 onPause 阶段相对比而言的。在 onPause 时,Activity 可能只是失去焦点但仍部分可见,而 onStop 则是整个 Activity 界面完全从屏幕上看不到了。

例如,启动了另一个全屏的 Activity ,新的 Activity 完全覆盖住了原 Activity ,使其彻底消失在屏幕视野内,这时原 Activity 就满足了不可见的条件,会触发 onStop 方法的调用。

(2)状态转变

一旦 onStop 方法被调用,Activity 便进入 ON_STOP 状态,意味着它在后台的程度更深了,距离与用户交互的前台状态更远了一步。

2. 与 onPause 及其他方法的关联

(1)与 onPause 的先后顺序

当 Activity 开始失去交互能力时,首先会回调 onPause 方法进入 ON_PAUSE 状态,此时它可能还可见。而如果接下来进入的是另一个全屏的 Activity,待新的 Activity 界面完整显示出来后,原 Activity 才会进一步进入 ON_STOP 状态并回调 onStop 方法。

这体现了从 Activity 逐渐失去前台地位到完全进入后台的一个过程顺序,先是暂停交互(onPause),再是彻底不可见(onStop)。

(2)与新 Activity 的 onResume 方法顺序

在一个 Activity 创建启动的过程中,其界面是在 onResume 方法之后才正式显示出来的。

相应地,当原 Activity 要进入 ON_STOP 状态时,onStop 方法会在新启动的 Activity 的 onResume 方法回调之后才被回调。也就是说,新 Activity 会先完成准备好能与用户交互的步骤,然后原 Activity 才会完全进入后台不可见的状态,这是安卓系统对于 Activity 生命周期流程的一种协调安排。

3. 操作特点及适用场景

(1)操作耗时问题

值得注意的是,被启动的 Activity 并不会等待原 Activity 的 onStop 执行完毕之后再显示。

这意味着即便在 onStop 方法里做一些比较耗时的操作,比如中断复杂的网络请求、断开数据库连接或者释放相机资源等相对重量级的资源释放操作,也不会导致新启动的 Activity 出现启动延迟的情况,因为它们的执行流程在时间上不是相互阻塞的。

(2)资源释放目的

onStop 方法存在的主要目的就是进行资源释放操作。由于它是在另一个 Activity 已经显示之后才被回调,所以相比 onPause 阶段,这里允许做一些相对耗时、更重量级的资源释放工作。

4. 与系统回收及恢复的关系

(1)系统回收情况

如果一个应用的全部 Activity 都处于 ON_STOP 状态,意味着整个应用当前在后台处于一种相对不活跃、不可见的状态,这种情况下系统为了节省内存等资源,是很有可能将这个应用杀死的,也就是强制终止该应用的运行。

(2)信息保留与恢复

而当一个处于 ON_STOP 状态的 Activity 被系统回收时,系统会把该 Activity 中视图(View)的相关信息保留到 Bundle 中,这个 Bundle 可以理解为一种数据存储结构。

那么下一次如果需要恢复这个 Activity(比如用户重新打开该应用或者切换回相关界面等情况),就可以在 onCreate 或者 onRestoreInstanceState 方法中利用这个 Bundle 里存储的数据来对之前的视图状态等进行恢复,尽可能让用户感受到应用状态的连贯性,提升用户体验。

5. 小结

总之,onStop 方法在 Activity 的生命周期中有着明确的定位和重要作用,准确把握它的调用时机、操作特点以及与系统回收恢复的关联,有助于开发者合理管理 Activity 的资源、优化应用性能以及保障良好的用户体验。

【onRestart】

1. 调用时机

(1)从另一个 Activity 切回时调用

在安卓应用中,当用户从当前应用内的另一个 Activity 切换回本 Activity 的时候,系统就会调用 onRestart 方法。

例如,用户从 Activity A 跳转到 Activity B 后,通过点击返回按钮或者其他导航操作又回到 Activity A,此时 Activity A 就会触发 onRestart 方法的调用。这表明该 Activity 即将重新进入前台,开始新一轮与用户交互的准备流程。

(2)从 ON_STOP 状态重新启动时调用

更具体地说,一般是在这个 Activity 处于 ON_STOP 状态(也就是之前已经完全不可见,处于后台较深的状态,可能是被其他全屏 Activity 覆盖等原因导致的),然后因为用户操作或者其他应用内的逻辑触发,需要重新启动、回到前台时,就会调用 onRestart 方法。这体现了它在 Activity 从后台再次走向前台这个过程中的关键起始作用。

2. 与其他方法的关联及后续状态变化

(1)紧接着调用 onStart 方法

当 onRestart 方法被调用后,系统会立即调用 onStart 方法。这是安卓 Activity 生命周期中一个连贯的流程安排,意味着 Activity 在确定要重新启动后,首先进入 onRestart 这个表示重新开始的阶段,然后马上进入 onStart 阶段,按照既定的生命周期步骤逐步完成从后台到前台的过渡准备。

(2)进入 ON_START 状态并走向前台

在 onStart 方法被调用后,Activity 就会进入 ON_START 状态,这标志着它已经朝着前台可交互的方向更进一步了。

后续通常还会经过 onResume 方法的调用等流程,最终让 Activity 完全进入前台,能够与用户正常进行交互,重新成为用户当前关注并操作的界面。

3. 小结

总的来说,onRestart 方法在 Activity 生命周期里起到了衔接从后台 ON_STOP 状态重新回到前台的关键作用,与 onStart 等方法配合,有序地引导 Activity 恢复到可交互的前台状态,开发者可以根据这个方法被调用的时机,在其中进行一些适合的初始化或者资源恢复相关操作(不过通常一些重要的初始化等操作更多是放在 onCreate 或者 onResume 中进行,具体取决于实际需求)。

【onDestroy】

1. 调用时机

(1)系统杀死情况

安卓系统出于内存管理等原因,当判定某个 Activity 占用内存资源过多、长时间处于后台且不再被需要,或者整个应用进入后台后系统资源紧张等情况下,可能会主动杀死 Activity。

例如,当手机内存不足,而当前应用的多个 Activity 又都处于后台不活跃状态时,系统就会选择将部分 Activity 杀死来释放内存,这时对应的 Activity 就会回调 onDestroy 方法。

(2)主动调用 finish 方法

在代码逻辑中,如果开发者通过调用 Activity 的 finish 方法来手动结束这个 Activity,同样也会触发 onDestroy 方法的回调。

比如在一个 Activity 中,当用户点击了 “退出” 按钮,开发者可以在按钮点击事件的处理逻辑里调用 finish 方法来关闭该 Activity,随后系统就会执行 onDestroy 方法。

2. 状态转变

一旦 onDestroy 方法被调用,Activity 就进入了 ON_DESTROY 状态,这意味着它已经处在即将被销毁的阶段,即将从内存中被清除,结束其本次生命周期的使命。

3. 资源释放的重要性

防止内存泄漏

它是 Activity 在被销毁前回调的最后一个方法,所以开发者必须要重视在这个方法中进行资源释放操作。

在 Activity 的运行过程中,可能会创建很多对象、开启一些线程、占用各种系统资源(比如注册了广播接收器、打开了文件流、持有数据库连接等),如果在 Activity 即将销毁时不及时释放这些资源,就可能导致内存泄漏问题

例如,若在 Activity 中创建了一个匿名内部类对象,并且这个对象内部持有对 Activity 的引用,而在 Activity 销毁时没有解除这种引用关系,那么即便 Activity 本应被回收,但由于仍被引用着,就会一直占用内存,随着时间推移和此类情况的多次出现,会使应用占用的内存越来越大,影响应用性能甚至导致应用崩溃。所以在 onDestroy 方法中,要确保释放所有不再需要的资源,像取消广播接收器的注册、关闭文件流、断开数据库连接等,以此来维持良好的内存管理,保障应用的稳定运行。

4. 后续情况说明

等待系统回收与重新创建

当 onDestroy 方法执行完毕后,Activity 就处于等待被系统回收的状态了,此时它在内存中的相关资源会逐步被清理。

如果后续用户再次打开这个 Activity(比如通过应用的启动图标或者应用内的导航再次进入该 Activity 对应的界面),那么整个 Activity 的生命周期会重新开始,会从 onCreate 方法开始执行,重新进行初始化、加载布局、设置资源等一系列创建操作,就如同全新创建一个 Activity 一样,再次完成从创建到可交互的整个过程。

5. 小结

总之,onDestroy 方法在 Activity 的生命周期中是一个至关重要的收尾环节,正确地处理好其中的资源释放工作,对于保证应用的内存健康、稳定运行以及符合良好的开发规范都有着不可忽视的作用。

平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_45956730/article/details/146484243

遇见资源网 移动开发 【Android】Activity 生命周期(详细介绍) http://www.ox520.com/157736.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务