Android开发实战班 - Activity 生命周期

Activity 是 Android 应用的基本组件之一,代表用户界面中的一个屏幕。理解 Activity 的生命周期对于开发稳定、高效的 Android 应用至关重要。本章节将深入讲解 Activity 的生命周期方法、生命周期流程以及如何在实际开发中正确管理 Activity 的状态。

4.1 Activity 简介

  • Activity 的定义

    • Activity 是 Android 应用中用于与用户交互的组件,每个 Activity 通常代表一个用户界面窗口。
    • 应用通常由多个 Activity 组成,例如登录页、主界面、设置页等。
  • Activity 的作用

    • 管理用户界面。
    • 处理用户交互事件。
    • 与其他组件进行通信。

4.2 Activity 生命周期方法

Activity 生命周期由一系列回调方法组成,这些方法在 Activity 的不同状态之间切换时被系统调用。理解这些方法对于正确管理 Activity 的状态至关重要。

  • onCreate(Bundle savedInstanceState):

    • Activity 被创建时调用。
    • 用于初始化 Activity,例如设置布局、初始化视图、绑定数据等。
    • savedInstanceState 参数用于保存和恢复 Activity 的状态。
  • onStart():

    • Activity 对用户可见时调用。
    • 紧随 onCreate()onRestart() 之后调用。
  • onResume():

    • Activity 与用户交互时调用。
    • Activity 处于前台,可以接收用户输入。
  • onPause():

    • Activity 暂停时调用。
    • 当 Activity 部分不可见时调用,例如打开新的 Activity 或弹出对话框。
    • 释放不需要的资源,例如停止动画、暂停视频播放等。
  • onStop():

    • Activity 停止时调用。
    • Activity 完全不可见时调用。
    • 释放不需要的资源,例如停止网络请求、释放内存等。
  • onRestart():

    • Activity 从停止状态重新启动时调用。
    • 紧随 onStop() 之后调用。
  • onDestroy():

    • Activity 被销毁时调用。
    • 释放所有资源,例如取消注册广播接收器、关闭数据库连接等。

4.3 Activity 生命周期流程

Activity 的生命周期流程可以分为以下几个阶段:

  1. 启动 Activity:

    • onCreate() -> onStart() -> onResume()
  2. 切换到后台:

    • 当前 Activity 调用 onPause(),然后新的 Activity 调用 onCreate(), onStart(), onResume()
    • 当前 Activity 调用 onStop()
  3. 返回前台:

    • 如果 Activity 没有被销毁,则调用 onRestart(), onStart(), onResume()
    • 如果 Activity 被销毁,则重新调用 onCreate(), onStart(), onResume()
  4. 销毁 Activity:

    • onPause() -> onStop() -> onDestroy()

4.4 Activity 生命周期示例

以下是一个简单的 Activity 示例,演示了生命周期方法的调用顺序:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)Log.d("ActivityLifecycle", "onCreate")}override fun onStart() {super.onStart()Log.d("ActivityLifecycle", "onStart")}override fun onResume() {super.onResume()Log.d("ActivityLifecycle", "onResume")}override fun onPause() {super.onPause()Log.d("ActivityLifecycle", "onPause")}override fun onStop() {super.onStop()Log.d("ActivityLifecycle", "onStop")}override fun onRestart() {super.onRestart()Log.d("ActivityLifecycle", "onRestart")}override fun onDestroy() {super.onDestroy()Log.d("ActivityLifecycle", "onDestroy")}
}
  • 启动 Activity:

    • onCreate() -> onStart() -> onResume()
  • 切换到后台:

    • onPause() -> onStop()
  • 返回前台:

    • onRestart() -> onStart() -> onResume()
  • 销毁 Activity:

    • onPause() -> onStop() -> onDestroy()

4.5 Activity 状态保存与恢复

  • 状态保存:

    • onSaveInstanceState() 方法中保存 Activity 的状态。
      override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)outState.putString("key", "value")
      }
      
  • 状态恢复:

    • onCreate() 方法中恢复 Activity 的状态。
      override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)if (savedInstanceState != null) {val value = savedInstanceState.getString("key")}
      }
      

4.6 Activity 任务与回退栈

  • 任务 (Task):

    • 一个任务是一组 Activity 的集合,代表用户执行的一个工作单元。
    • 例如,打开邮件应用 -> 查看邮件 -> 回复邮件,这三个 Activity 属于同一个任务。
  • 回退栈 (Back Stack):

    • Activity 按照打开顺序被压入回退栈中。
    • 用户按返回键时,Activity 从回退栈中弹出。
  • 管理任务:

    • 使用 Intent 标志位管理任务,例如 FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP 等。

4.7 Activity 生命周期与配置变化

  • 配置变化:

    • 例如屏幕旋转、语言切换等,会导致 Activity 销毁并重新创建。
  • 保存与恢复状态:

    • 使用 onSaveInstanceState()onRestoreInstanceState() 方法保存和恢复状态。
    • 或者使用 ViewModel 来管理 UI 相关数据。

4.8 实战案例

  1. 案例一:日志记录 Activity 生命周期

    • 在 Activity 的生命周期方法中添加日志输出。
    • 运行应用,观察日志输出,理解 Activity 生命周期流程。
  2. 案例二:保存与恢复 Activity 状态

    • 在 Activity 中保存文本输入框的内容。
    • 旋转屏幕,观察状态是否正确恢复。

4.9 课后作业

  1. 任务一:观察 Activity 生命周期

    • 创建一个新的 Activity,在生命周期方法中添加日志输出。
    • 运行应用,执行不同的操作,例如启动 Activity、切换到后台、返回前台、销毁 Activity,观察日志输出,理解 Activity 生命周期流程。
  2. 任务二:管理 Activity 状态

    • 在 Activity 中添加一个文本输入框。
    • onSaveInstanceState() 方法中保存文本输入框的内容。
    • onCreate() 方法中恢复文本输入框的内容。
    • 旋转屏幕,观察状态是否正确恢复。
  3. 任务三:管理任务与回退栈

    • 创建两个 Activity,ActivityA 和 ActivityB。
    • 从 ActivityA 打开 ActivityB。
    • 使用不同的 Intent 标志位,例如 FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP,观察 Activity 任务和回退栈的变化。

通过本章节的学习,学员将能够理解 Activity 的生命周期方法,掌握 Activity 状态保存与恢复的方法,并能够管理 Activity 任务与回退栈,为开发稳定的 Android 应用打下基础。

作者简介

前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!

温馨提示:可搜老码小张公号联系导师

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

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

相关文章

Python轴承故障诊断 (19)基于Transformer-BiLSTM的创新诊断模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

STM32设计学生宿舍监测控制系统-分享

目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 电路图采用Altium Designer进行设计: 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 本项目旨在利用STM32单片机为核心,结合传感器技术、无线通信技…

英伟达 Isaac Sim仿真平台体验

一、产品名称及版本 Isaac Sim 是由 NVIDIA 开发的一款基于物理模拟的机器人仿真平台,旨在为机器人开发者和研究人员提供一个高效、真实的仿真环境。Isaac Sim 基于 NVIDIA 的 Omniverse 平台,结合了强大的图形渲染、物理引擎和深度学习能力,…

利用寄存器方式,点亮led3最小板

作业:利用寄存器方式,点亮led3小灯 1.通过观察原理图, led3, 是PA8, 一段接3.3v, 一端接io口, 所以PA8端口输出低电平, 就可以让小灯点亮了 2.利用keil创建最小工程 点击跳转博客 3.按照库函数的配置方式 #include "stdint.h" #include "stm32f10x.h" …

Helius:从数据出发,衡量 Solana 的真实去中心化程度

撰文:Lostin,Helius 编译:Yangz,Techub News 摘要 截至 Epoch 685,Solana 有 4514 个节点,包括 1414 个验证者和 3100 个 RPC。没有哪个验证者控制的质押份额超过 3.2%。 中本聪系数(NC&#…

SpringBoot 增量部署发布(第2版)

一、背景介绍 书接上一篇《SpringBoot 增量部署发布_springboot增量部署-CSDN博客》,上一篇内容实现了将静态资源与jar分离,但是即使是打包成**-exec.jar,解压jar文件,可以看到里面包含了static,resource目录&#xf…

一篇保姆式centos/ubantu安装docker

前言: 本章节分别演示centos虚拟机,ubantu虚拟机进行安装docker。 上一篇介绍:docker一键部署springboot项目 一:centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

结构体的深入学习:内存对齐等

结构体的创建 //结构体类型的定义//学生 struct Stu {//学生的相关属性char name[20];int age; };结构体变量的创建 struct Stu {//学生的相关属性char name[20];int age; }s1, s2;//s1,s2全局变量int main() {struct Stu s3;//s3是局部变量return 0; }匿名结构体…

QString 转 char*问题与方法(const_cast的使用问题)

1、背景:今天有QString的变量,将QString的值传递给void func(char * ptr),于是就有了类似下面这一段离谱的代码 当时我还在想为什么var的值为空了,为什么呢。 2、原因:就是因为右边函数返回的是一个临时指针对象,给到了右边&…

【Redis】Redis实现的消息队列

一、用list实现【这是数据类型所以支持持久化】 消息基于redis存储不会因为受jvm内存上限的限制,支持消息的有序性,基于redis的持久化机制,只支持单一消费者订阅,无法避免消息丢失。 二、用PubSub【这不是数据类型,是…

PHP开发全新UI多语言多商户跨境商城源码、支持一键铺货、一键下单

商家可在平台产品库选品,一键铺货到自己商店,用户下单后,商家提交订单给平台,扣除商家供货价所需余额,提交后由平台发货,收货后订单金额结算给商家. 源码开源完整,一切能跑通的逻辑流程都可以二…

Matlab实现北方苍鹰优化算法优化随机森林算法模型 (NGO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 北方苍鹰优化算法(Northern Goshawk Optimization, NGO)是一种新颖的群智能优化算法,灵感源自北方苍鹰捕食时的策略。该算法通过模拟苍鹰的搜寻、接近和捕捉猎物的行为模式&am…

【TQ2440】01 ADS1.2 安装

TQ2440是一款基于Samsung S3C2440处理器的ARM9开发板,广泛应用于嵌入式系统学习和开发 TQ2440 开发配套资料 https://pan.baidu.com/s/1cMMK9HQdq1Ou8-K9fnw-DA?pwd5y5r ADS1.2安装包链接:https://pan.baidu.com/s/1BBJb4jYKLOYXIMD86WCycA?pwdf7zr 1、…

不完全微分PID控制算法

不完全微分PID控制算法是一种改进的PID控制方法,主要针对PID控制中的微分环节对高频噪声敏感的问题。通过对微分项进行优化和改造,减少其对噪声的放大作用,同时保留对系统动态变化的响应能力。 不完全微分PID控制原理 不完全微分的核心思想是…

IntelliJ IDEA常用快捷键

文章目录 环境快捷键外观编辑移动光标提示查找Live Templates列操作调试运行 环境 Ubuntu 24.04.1IntelliJ IDEA 2024.1.6 快捷键 外观 Alt 1:打开/关闭“项目”窗口(即左边的导航窗口) Alt 4:打开/关闭“运行”窗口 Alt …

标题gitLab如何打标签

标题gitLab打标签 1、首先进入到项目里面,找到Repository下的Tages,点击进入 如果是还没有创建过标签,会提示如何用命令创建 git tag -a v1.4 -m "version 1.4"2、也可以直接在界面创建,点击new Tag按钮 3、填写标签…

C++AVL平衡树

1.AVL平衡树节点定义 每一个节点都配左右孩子和父节点&#xff0c;以及平衡因子和其所对应的值。 template<class K, class V> struct AVLTreeNode {// 需要parent指针&#xff0c;后续更新平衡因子可以看到pair<K, V> _kv;AVLTreeNode<K, V>* _left;AVLTr…

Java进阶四-异常,File

异常 概念&#xff1a;代表程序出现的问题。 目的&#xff1a;程序出现了异常我们应该如何处理。 最高父类&#xff1a;Exception 异常分为两类 编译时异常&#xff1a;没有继承RuntimeException的异常,直接继承与Exception,编译阶段就会错误提示。运行时异常:RuntimeExc…

向量数据库FAISS之四:向量检索和 FAISS

来自 YouTube 1.相似度搜索的传统方法(Jaccard, w-shingling, Levenshtein) 1.Jaccard 距离 公式 Jaccard ( A , B ) 1 − ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{Jaccard}(A, B) 1 - \frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)1−∣A∪B∣∣A∩B∣​ 其中&#xff0c; A 和 …

Stata17最新保姆级安装教程【附安装包】

文章目录 Stata介绍 Stata下载 Stata安装步骤 Stata介绍 Stata 是一套提供其使用者数据分析、数据管理以及绘制专业图表的完整及整合性统计软件。它提供许许多多功能&#xff0c;包含线性混合模型、均衡重复反复及多项式普罗比模式等。 Stata下载 Stata 64位下载链接&…