Activity的生命周期分析

news2024/12/24 22:15:46

目录

Activity的生命周期全面分析

典型情况下的生命周期分析

异常情况下的生命周期分析

情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建


Activity的生命周期全面分析

在Android开发中,Activity的生命周期是非常重要的概念。它描述了Activity在不同状态下的转换过程。根据你提供的内容,Activity的生命周期可以分为两部分:

  1. 典型情况下的生命周期:这是指在有用户参与的情况下,Activity所经历的生命周期变化。这些状态包括:

    1. onCreate(Bundle savedInstanceState):Activity创建时调用。

    2. onStart():Activity变为可见时调用。

    3. onResume():Activity开始与用户交互时调用。

    4. onPause():Activity失去焦点,但不一定会停止时调用。

    5. onStop():Activity不可见时调用。

    6. onDestroy():Activity销毁时调用。

  2. 异常情况下的生命周期:这是指Activity由于系统回收或者设备配置发生变化(如屏幕旋转)导致Activity被销毁重建时的生命周期。在这种情况下,关注点和典型情况下略有不同,主要关注:

    1. onSaveInstanceState(Bundle outState):在Activity因配置更改或内存不足被销毁前调用,用于保存状态。

    2. onRestoreInstanceState(Bundle savedInstanceState):在Activity重建时调用,用于恢复之前保存的状态。

这些生命周期方法允许开发者管理Activity的状态,确保在Activity重建时用户界面和数据能够正确恢复。

典型情况下的生命周期分析

在正常情况下,Activity会经历如下生命周期:

  1. onCreate()

    1. 作用:Activity正在被创建,这是生命周期的第一个方法。

    2. 使用场景:比如调用setContentViView去加载界面布局资源、初始化Activity所需数据等。

  2. onRestart()

    1. 作用:Activity正在重新启动,从不可见面重新变为可见状态时调用。

    2. 使用场景:这种情形一般是用户行为所导致的,比如用户按Home键切换到桌面或者用户打开了一个新的Activity,这时当前的Activity就会暂停,也就是onPause和onStop被执行了,接着用户又回到了这个Activity,就会出现这种情况。

  3. onStart()

    1. 作用:Activity正在被启动,即将开始,此时Activity已经可见,但还没有出现在前台,无法和用户交互。

    2. 使用场景:可以理解为Activity已经显示出来了,但用户还看不到。

  4. onResume()

    1. 作用:Activity已经可见,并且出现在前台并开始活动。

    2. 使用场景:要注意这个和onStart的对比,onStart和onResume都表示Activity已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。

  5. onPause()

    1. 作用:Activity正在停止,正常情况下,紧接着onStop就会被调用。

    2. 使用场景:用户切换到另一个Activity或按下Home键,或者有新的Activity覆盖了当前Activity。

    3. 在特殊情况下,如果这个时候快速地再回到当前Activity,那么onResume会被调用。笔者的理解是,这种情况属于极端情况,用户操作很难重现这一场景。此时可以做一些存储数据、停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause必须先执行完,新Activity的onResume才会执行。

  6. onStop()

    1. 作用:Activity即将停止,可以做一些稍微重量级的回收工作。

    2. 使用场景:Activity不再可见,如被新的Activity覆盖,或者用户切换到了其他应用。

  7. onDestroy()

    1. 作用:Activity即将被销毁,这是Activity生命周期中的最后一个回调。

    2. 使用场景:Activity的整个生命周期结束,进行资源释放和回收工作。

Activity的生命周期回调顺序对于理解Activity的行为至关重要。以下是一些典型的生命周期回调场景:

  1. 第一次启动Activity

    1. 回调顺序:onCreate -> onStart -> onResume。

    2. 描述:Activity从创建到显示在用户面前的过程。

  2. 用户打开新的Activity或切换到桌面

    1. 回调顺序:onPause -> onStop。

    2. 描述:当前Activity失去焦点,变为不可见状态。

    3. 特殊情况:如果新Activity采用了透明主题,当前Activity可能不会回调onStop。

  3. 用户再次回到原Activity

    1. 回调顺序:onRestart -> onStart -> onResume。

    2. 描述:Activity从后台重新回到前台。

  4. 用户按back键回退

    1. 回调顺序:onPause -> onStop -> onDestroy。

    2. 描述:Activity从前台消失,被销毁。

  5. Activity被系统回收后再次打开

    1. 回调顺序:与第一次启动相同,即onCreate -> onStart -> onResume。

    2. 注意:虽然生命周期方法回调相同,但不代表所有过程都一样。

  6. Activity的整个生命周期

    1. onCreate和onDestroy是配对的,分别标识Activity的创建和销毁。并且只可能有一次调用。

    2. onStart和onStop是配对的,表示Activity是否可见。

    3. onResume和onPause是配对的,表示Activity是否位于前台。随着用户的操作或者设备屏幕的点亮和熄灭,这四个方法可能被调用多次

小问题:

  1. onStart和onResume、onPause和onStop从描述上来看差不多,对我们来说有什么实质的不同呢?

      先说第一个问题,从实际使用过程来说,onStart和onResume、onPause和onStop看起来的确差不多,甚至我们可以只保留其中一对,比如只保留onStart和onStop。既然如此,那为什么Android系统还要提供看起来重复的接口呢?根据上面的分析,我们知道,这两个配对的回调分别表示不同的意义,onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的,除了这种区别,在实际使用中没有其他明显区别。

  2. 假设当前Activity为A,如果这时用户打开一个新ActivityB,那么B的onResume和A的onPause哪个先执行呢?

      在新Activity启动之前,桟顶的Activity需要先onPause后,新Activity才能启动。

      旧Activity的onPause先调用,然后新Activity才启动,这也证实了我们上面的分析过程。也许有人会问,你只是分析了Android5.0的源码,你怎么知道所有版本的源码都是相同逻辑呢?关于这个问题,我们的确不大可能把所有版本的源码都分析一遍,但是作为Android运行过程的基本机制,随着版本的更新并不会有大的调整,因为Android系统也需要兼容性,不能说在不同版本上同一个运行机制有着截然不同的表现。关于这一点我们需要把握一个度,就是对于Android运行的基本机制在不同Android版本上具有延续性。

      从另一个角度来说,Android官方文档对onPause的解释有这么一句:不能在onPause中做重量级的操作,因为必须onPause执行完成以后新Activity才能Resume,从这一点也能间接证明我们的结论。

      通过分析这个问题,我们知道onPause和onStop都不能执行耗时的操作,尤其是onPause,这也意味着,我们应当尽量在onStop中做操作,从而使得新Activity尽快显示出来并切换到前台。

异常情况下的生命周期分析

Activity除了受用户操作所导致的正常的生命周期方法调度,还有一些异常情况,比如当资源相关的系统配置发生改变以及系统内存不足时,Activity就可能被杀死

资源相关的系统配置发生改变导致Activity被杀死并重新创建

理解这个问题,我们首先要对系统的资源加载机制有一定了解,这里不详细分析系统的资源加载机制,只是简单说明一下。拿最简单的图片来说,当我们把一张图片放在drawable目录后,就可以通过Resources去获取这张图片。同时为了兼容不同的设备,我们可能还需要在其他一些目录放置不同的图片,比如drawable-mdpi、drawablehdpi、drawable-land等。这样,当应用程序启动时,系统就会根据当前设备的情况去加载合适的Resources资源,比如说横屏手机和竖屏手机会拿到两张不同的图片(设定了landscape或者portrait状态下的图片)。比如说当前Activity处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity就会被销毁并且重新创建,当然我们也可以阻止系统重新创建我们的Activity。在默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建

当系统配置发生改变后,Activity会被销毁,其onPause、onStop、onDestroy均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用时机是在onStop之前,它和onPause没有既定的时序关系,它既可能在onPause之前调用,也可能在onPause之后调用。需要强调的一点是,这个方法只会出现在Activity被异常终止的情况下,正常情况下系统 不 会 回 调 这 个 方 法 。 当 Activity 被 重 新 创 建 后 , 系 统 会 调 用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。因此,我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果被重建了,那么我们就可以取出之前保存的数据并恢复,从时序上来说,onRestoreInstanceState的调用时机在onStart之后。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数仓建模:DataX同步Mysql数据到Hive如何批量生成建表语句?| 基于SQL实现

目录 一、需求 二、实现步骤 1.数据类型转换维表 2.sql批量生成建表语句 三、小结 如果觉得本文对你有帮助,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下: 数字化建设通关指南 专栏 原价99,现在活动价39.9&#x…

前端使用xlsx-js-style导出Excel,带样式,并处理合并单元格边框显示不全和动态插入表头解决

一、在学习之前,先给出一些学习/下载地址: xlsx-js-style下载地址 https://github.com/gitbrent/xlsx-js-style 或者 https://www.npmjs.com/package/xlsx-js-style SheetJS中文教程: https://xlsx.nodejs.cn/docs/csf/cell 二、先看样…

双指针---(部分地更新)

双指针 复写零 给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。 注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。 …

Tableau 瀑布图应用示例

通过探索 10 个示例,将瀑布图的应用拓展到更深层次的业务分析! 作为一种直观展示数据变化的图表,瀑布图被广泛应用在业务分析中。同时,借助 Tableau 2024.2 中的 Viz Extensions,如今我们可以快速在 Tableau 中实现瀑布…

Vue3-TS-Lodash:理解Lodash / 常用方法积累

一、Lodash官网 Lodash 简介 | Lodash中文文档 | Lodash中文网 二、理解Lodash Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。它提供了大量的函数来帮助你处理数组、数值、对象、字符串等,使你的代码更加简洁、易读和高效。Lodash 的设计哲学是…

25基于python的文本冒险岛游戏(源码+游戏简介+python代码学习攻略)校园招聘面试

基于python的文本冒险岛游戏(源代码游戏简介python代码学习)资源-CSDN文库https://download.csdn.net/download/m0_72216164/89817518 开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费!全文干货。 工作招聘无…

HarmoneyOS--Ability(能力)、窗口、通知

标题 文章目录 一、什么是Ability?二、使用步骤(单例和多例)三、窗口四、通知 一、什么是Ability? 开发模式提供的开发功能抽象的描述。 其中重要的是UiAbility,界面组件能力,负责所有界面的处理。 通过配置可以变更单例,多例,指定实例,在module.json5中进行配置 如: 单例:l…

FreeRTOS的中断管理

前言 FreeRTOS的任务有优先级,MCU的硬件中断有中断优先级,这是两个不同的概念,FreeRTOS的任务管理要用到硬件中断,使用FreeRTOS时候也可以使用硬件中断,但是硬件中断ISR的设计要注意一些设计原则,在本节中我…

RVC变声器入门

主要参考资料: RVC变声器官方教程:10分钟克隆你的声音!一键训练,低配显卡用户福音!: https://www.bilibili.com/video/BV1pm4y1z7Gm/?spm_id_from333.337.search-card.all.click&vd_sourcedd284033cd0c4d1f3f59a2…

RocketMQ消息发送之广播模式

前言 在前面的文章中我们回顾了RocketMQ的顺序消息和乱序消息,以及里面包含的乱序消息和全局消息,RocketMQ支持多种消息类型和消费模式 今天这篇文章主要介绍RocketMQ的广播消息。希望文章能为正在学习RocketMQ相关知识的大佬们提供帮助! 广…

全自动ai生成视频MoneyPrinterTurbo源码 在线ai生成视频源码

介绍: 现在短视频这么火爆,流量就是金钱。 如果能全自动的生成短视频,是不是很容易带来流量,赚到马内。 MoneyPrinter 这个开源项目就可以自动生成短视频,而且质量还不错,不是那种低质的营销视频。 使用…

画个心,写个花!Python Turtle库带你玩转创意绘图!

文章目录 前言一、Turtle 库基础介绍二、画布设置三、画笔属性设置1.画笔颜色设置2.画笔粗细与速度设置3.画笔形状设置 四、画笔移动函数五、画笔控制函数六、实战案例一:“花”字绘制七、实战案例二:心型图案绘制总结 前言 Python 的 turtle 库是一种简…

【MySQL内置数据库】 mysql

目录 统计 columns_priv component db default_roles engine_cost func general_log global_grants gtid_executed help_category help_keyword help_relation help_topic innodb_index_stats innodb_table_stats ndb_binlog_index password_history plugin…

【RocketMQ】SpringBoot整合RocketMQ

🎯 导读:本文档详细介绍了如何在Spring Boot应用中集成Apache RocketMQ,并实现消息生产和消费功能。首先通过创建消息生产者项目,配置POM文件引入RocketMQ依赖,实现同步消息发送,并展示了如何发送普通字符串…

STM32+ADC+扫描模式

1 ADC简介 1 ADC(模拟到数字量的桥梁) 2 DAC(数字量到模拟的桥梁),例如:PWM(只有完全导通和断开的状态,无功率损耗的状态) DAC主要用于波形生成(信号发生器和音频解码器) 3 模拟看门狗自动监…

Ract vs Vue 你更喜欢谁?

React 和 Vue 是当今最受欢迎的两个前端框架,各自有其独特的特点和优势。以下是对这两个框架的详细比较和分析,以帮助你了解它们的异同和适用场景: React 简介 React 是由 Facebook 开发和维护的一个开源 JavaScript 库,主要用于…

OpenAI员工流失的背后:地盘争夺、倦怠、薪酬要求

近日,OpenAI的CTO Mira Murati宣布离职,同一天,首席研究官Bob McGrew、研究副总裁Barret Zoph也宣布离职。 据统计,这已经是2024年第11起OpenAI高管离职事件了。 至今,开启“ChatGPT时刻”的四位OpenAI领袖&#xff…

河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例

河南移动,作为电信全业务运营企业,不仅拥有庞大的客户群体和业务规模,还引领着业务产品与服务体系的创新发展。河南移动的原有核心营业系统承载着超过6000万的庞大用户量,管理着超过80TB的海量数据,因此也面临着数据规…

扩散模型(2)--1

1.简介 生成模型通过学习并建模输入数据的分布,从而采集生成新的样木,该模型广泛运用于图片视频生成、文本生成和药物分子生成。扩散模型是一类概率生成模型,扩散模型通过向数据中逐步加入噪声来破坏数据的结构,然后学习一个相对应…

在Windows系统上安装的 Boost C++ 库

步骤一 https://www.boost.org/users/history/version_1_86_0.html 下载Boost库文件: 步骤二 安装: https://www.boost.org/doc/libs/1_52_0/doc/html/bbv2/installation.html 点击运行.\bootstrap.bat脚本在当前目录的powershell中执行:./b2 install --prefixPREFIX 然后…