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.rhkb.cn/news/474585.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络——套接字编程

1. 网络通信基本脉络 基本脉络图如上,其中数据在不同层的叫法不一样,比如在传输层时称为数据段,而在网络层时称为数据报。我们可以在 Linux 中使用 ifconfig 查看网络的配置,如图 其中,inet 表示的是 IPv4,…

深度学习的实践层面

深度学习的实践层面 设计机器学习应用 在训练神经网络时,超参数选择是一个高度迭代的过程。我们通常从一个初步的模型框架开始,进行编码、运行和测试,通过不断调整优化模型。 数据集一般划分为三部分:训练集、验证集和测试集。常…

Jmeter 如何导入证书并调用https请求

Jmeter 如何导入证书并调用https请求 通过SSL管理器添加证书文件 支持添加的文件为.p12,.pfx,.jks 如何将pem文件转换为pfx文件? 在公司内部通常会提供3个pem文件。 ca.pem:可以理解为是根证书,用于验证颁发的证…

LabVIEW 温湿度测试与监控系统

煤炭自燃是煤矿和煤炭储存领域面临的重大安全隐患,尤其是在煤炭堆积和运输过程中,温湿度变化会直接影响煤体的氧化速率和自燃倾向。传统的监测手段通常存在实时性差、数据处理复杂等问题,难以准确评估煤自燃的风险。因此,设计了一…

IDEA 开发工具常用快捷键有哪些?

‌在IDEA中,输出System.out.println()的快捷键是sout,输入后按回车(或Tab键)即可自动补全为System.out.println()‌‌。 此外,IDEA中还有一些其他常用的快捷键: 创建main方法的快捷键是psvm,代…

KF UKF

我需要Kalman 现在,主要是用来处理检测问题情况里的漏检,因为模拟了一段2D, (x,y)的数据,为了看效果,画的线尽量简单一点: import numpy as np import matplotlib.pyplo…

多品牌摄像机视频平台EasyCVR视频融合平台+应急布控球:打造城市安全监控新体系

在当今快速发展的智慧城市和数字化转型浪潮中,视频监控技术已成为提升公共安全、优化城市管理、增强应急响应能力的重要工具。EasyCVR视频监控平台以其强大的多协议接入能力和多样化的视频流格式分发功能,为用户提供了一个全面、灵活、高效的视频监控解决…

第8章硬件维护-8.2 可维护性和可靠性验收

8.2 可维护性和可靠性验收 可维护性和可靠性验收非常重要,硬件维护工程师在后端发现问题后,总结成可维护性和可靠性需求,在产品立项的时候与新特性一起进行需求分析,然后经过设计、开发和测试环节,在产品中落地。这些需…

医学图像语义分割:前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室

医学图像语义分割:前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室 语义分割网络FCN:通过将全连接层替换为卷积层并使用反卷积上采样,实现了第一个端到端的像素级分割网络U-Net:采用对称的U形编解码器结构&#xff…

如何解决多系统数据重复与冲突问题?

多系统并行运作已成为现代企业的常态。企业通常同时使用ERP、CRM、HR等多个业务系统来管理不同的功能模块。然而,这种多系统环境也带来了一个常见且棘手的问题:数据重复与矛盾。由于各系统独立运行且缺乏有效的集成机制,不同系统间的数据容易…

麒麟时间同步搭建chrony服务器

搭建chrony服务器 在本例中,kyserver01(172.16.200.10)作为客户端,同步服务端时间;kyserver02(172.16.200.11)作为服务端,提供时间同步服务。 配置服务端,修改以下内容…

【GPTs】Ai-Ming:AI命理助手,个人运势与未来发展剖析

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 💯GPTs指令💯前言💯Ai-Ming主要功能适用场景优点缺点 💯小结 💯GPTs指令 中文翻译: defcomplete_sexagenary(年&a…

Chainlit快速实现AI对话应用将聊天记录的持久化到MySql关系数据库中

概述 默认情况下,Chainlit 应用不会保留其生成的聊天和元素。即网页一刷新,所有的聊天记录,页面上的所有聊天记录都会消失。但是,存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。 之前写过一篇文章《Chainlit快速…

【动手学深度学习Pytorch】6. LeNet实现代码

LeNet(LeNet-5)由两个部分组成:卷积编码器和全连接层密集块 x.view(): 对tensor进行reshape import torch from torch import nn from d2l import torch as d2lclass Reshape(torch.nn.Module):def forward(self, x):return x.view(-1, 1, 28…

AI工具百宝箱|任意选择与Chatgpt、gemini、Claude等主流模型聊天的Anychat,等你来体验!

文章推荐 AI工具百宝箱|使用Deep Live Cam,上传一张照片就可以实现实时视频换脸...简直太逆天! Anychat 这是一款可以与任何模型聊天 (chatgpt、gemini、perplexity、claude、metal llama、grok 等)的应用。 在页面…

Excel数据动态获取与映射

处理代码 动态映射 动态读取 excel 中的数据,并通过 json 配置 指定对应列的值映射到模板中的什么字段上 private void GetFreightFeeByExcel(string filePath) {// 文件名需要以快递公司命名 便于映射查询string fileName Path.GetFileNameWithoutExtension(fi…

SRP 实现 Cook-Torrance BRDF

写的很乱! BRDF(Bidirectional Reflectance Distribution Function)全称双向反射分布函数。辐射量单位非常多,这里为方便直观理解,会用非常不严谨的光照强度来解释说明。 BRDF光照模型,上反射率公式&#…

[代码随想录Day16打卡] 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

找树左下角的值 定义:二叉树中最后一行最靠左侧的值。 前序,中序,后序遍历都是先遍历左然后遍历右。 因为优先遍历左节点,所以递归中因为深度增加更新result的时候,更新的值是当前深度最左侧的值,到最后就…

【第七节】在RadAsm中使用OllyDBG调试器

前言 接着本专栏上一节,我们虽然已经用上RadAsm进行编写x86汇编代码并编译运行,但是想进行断点调试怎么办。RadAsm里面找不到断点调试,下面我们来介绍如何在RadAsm上联合调试器OllyDBG进行调试代码。 OllyDBG的介绍与下载 OllyDBG 是一款功能…

WPF MVVM框架

一、MVVM简介 MVC Model View Control MVP MVVM即Model-View-ViewModel,MVVM模式与MVP(Model-View-Presenter)模式相似,主要目的是分离视图(View)和模型(Model),具有低…