Android Studio开发中Application和Activity生命周期详解

news2025/4/26 5:59:17

在这里插入图片描述

文章目录

    • Application生命周期
      • Application生命周期概述
      • Application关键回调方法
        • onCreate()
        • onConfigurationChanged()
        • onLowMemory()
        • onTrimMemory()
        • onTerminate()
      • Application生命周期管理最佳实践
    • Activity生命周期
      • Activity生命周期概述
      • Activity生命周期回调方法
        • onCreate()
        • onStart()
        • onResume()
        • onPause()
        • onStop()
        • onDestroy()
        • onRestart()
      • Activity生命周期状态转换
      • 特殊情况处理
        • 配置变更(如屏幕旋转)
        • 多窗口模式
        • 后台限制
      • Activity生命周期最佳实践
    • Application与Activity生命周期的交互
    • 高级主题
      • 进程生命周期
      • 任务和返回栈
      • 启动模式对生命周期的影响
    • 调试与日志记录
    • 常见问题与解决方案
    • 总结

在这里插入图片描述

Application生命周期

Application类是Android应用的全局基类,代表整个应用程序的上下文环境。理解Application的生命周期对于管理全局资源和应用状态至关重要。

Application生命周期概述

Application的生命周期从应用启动开始,到应用终止结束,主要包括以下几个关键阶段:

  1. 创建阶段:应用进程启动时创建Application实例
  2. 配置阶段:应用组件初始化及配置
  3. 运行阶段:应用处于活动状态
  4. 终止阶段:应用进程被系统回收

Application关键回调方法

onCreate()

onCreate()是Application生命周期中最重要的回调方法:

@Override
public void onCreate() {
    super.onCreate();
    // 在这里初始化全局资源
    Log.d("Application", "onCreate called");
}

调用时机

  • 应用进程创建后立即调用
  • 在任何Activity、Service或Receiver创建之前调用

典型用途

  • 初始化全局对象(如数据库、图片加载库)
  • 设置应用级别的配置
  • 初始化统计分析SDK
  • 设置全局异常处理器

注意事项

  • 避免在此方法中执行耗时操作(超过5秒可能导致ANR)
  • 不要在此方法中直接进行UI操作
onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // 处理配置变更
}

调用时机

  • 设备配置发生改变时调用(如屏幕旋转、语言切换)

典型用途

  • 处理特定的配置变更
  • 更新与配置相关的资源
onLowMemory()
@Override
public void onLowMemory() {
    super.onLowMemory();
    // 释放非关键资源
}

调用时机

  • 系统内存不足时调用

典型用途

  • 释放缓存资源
  • 减少内存占用
onTrimMemory()
@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    // 根据内存级别释放资源
}

调用时机

  • 系统需要应用释放内存时调用

内存级别参数

  • TRIM_MEMORY_COMPLETE:进程可能很快被终止
  • TRIM_MEMORY_MODERATE:进程位于LRU列表中间位置
  • TRIM_MEMORY_BACKGROUND:进程位于LRU列表底部
onTerminate()
@Override
public void onTerminate() {
    super.onTerminate();
    // 应用终止时清理
}

注意

  • 此方法仅在模拟器上调用,真机上不会调用
  • 不要依赖此方法进行关键资源清理

Application生命周期管理最佳实践

  1. 轻量级初始化:保持onCreate()方法简洁,延迟加载非必要资源
  2. 内存管理:合理实现onTrimMemory()和onLowMemory()回调
  3. 全局状态管理:使用Application类管理应用全局状态时要谨慎
  4. 避免静态引用:防止内存泄漏

Activity生命周期

Activity是Android应用的UI组件,理解其生命周期对于创建流畅的用户体验至关重要。

Activity生命周期概述

Activity生命周期由一系列状态组成,系统通过回调方法与Activity交互。主要状态包括:

  1. 创建状态:Activity正在被创建
  2. 启动状态:Activity可见但未获取焦点
  3. 恢复状态:Activity可见且获取焦点(用户可交互)
  4. 暂停状态:Activity部分可见(如被对话框覆盖)
  5. 停止状态:Activity完全不可见
  6. 销毁状态:Activity被销毁

Activity生命周期回调方法

onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 初始化Activity
}

调用时机

  • Activity首次创建时调用

典型用途

  • 设置布局(setContentView)
  • 初始化视图
  • 绑定数据
  • 恢复保存的实例状态

参数说明

  • savedInstanceState:包含之前保存的状态(如果是重建)
onStart()
@Override
protected void onStart() {
    super.onStart();
    // Activity变为可见状态
}

调用时机

  • Activity变为可见时调用
  • 在onCreate()之后或onRestart()之后调用

典型用途

  • 注册广播接收器
  • 初始化需要在Activity可见时运行的组件
onResume()
@Override
protected void onResume() {
    super.onResume();
    // Activity获取用户焦点
}

调用时机

  • Activity进入前台并获取用户输入焦点时调用
  • 在onStart()之后调用

典型用途

  • 启动动画
  • 打开独占设备资源(如相机)
  • 恢复暂停的操作
onPause()
@Override
protected void onPause() {
    super.onPause();
    // Activity失去焦点
}

调用时机

  • 当Activity开始失去焦点时调用
  • 另一个Activity进入前台前调用

典型用途

  • 提交未保存的更改
  • 释放系统资源
  • 停止动画或其他消耗CPU的操作

重要说明

  • 此方法执行时间应尽可能短
  • 不要执行耗时操作(会延迟下一个Activity的显示)
onStop()
@Override
protected void onStop() {
    super.onStop();
    // Activity完全不可见
}

调用时机

  • Activity完全不可见时调用
  • 在onPause()之后调用

典型用途

  • 释放/注销不需要在后台运行的资源
  • 保存数据到持久存储
onDestroy()
@Override
protected void onDestroy() {
    super.onDestroy();
    // Activity被销毁前调用
}

调用时机

  • Activity被销毁前调用
  • 可能是用户主动关闭或系统为回收内存

典型用途

  • 清理所有资源
  • 关闭数据库连接
  • 注销所有广播接收器
onRestart()
@Override
protected void onRestart() {
    super.onRestart();
    // Activity从停止状态重新启动
}

调用时机

  • Activity从停止状态重新显示时调用
  • 在onStop()之后,onStart()之前调用

典型用途

  • 重新初始化在onStop()中释放的资源

Activity生命周期状态转换

  1. 完整生命周期:onCreate() → … → onDestroy()
  2. 可见生命周期:onStart() → … → onStop()
  3. 前台生命周期:onResume() → … → onPause()

特殊情况处理

配置变更(如屏幕旋转)

当配置变更发生时:

  1. 当前Activity被销毁(onPause() → onStop() → onDestroy())
  2. 新Activity被创建(onCreate() → onStart() → onResume())

保存状态

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("key", "value");
}

恢复状态

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        String value = savedInstanceState.getString("key");
    }
}
多窗口模式

在多窗口模式下:

  • 当Activity失去焦点但部分可见时,只调用onPause()不调用onStop()
  • 调整窗口大小时会触发配置变更
后台限制

Android对后台Activity的限制:

  • 后台Activity可能被系统回收
  • 应妥善保存状态以便恢复

Activity生命周期最佳实践

  1. 合理分配资源

    • 在onCreate()中初始化长期资源
    • 在onResume()中获取独占资源
    • 在onPause()中释放独占资源
  2. 数据持久化

    • 重要数据应在onPause()中保存
    • 临时状态使用onSaveInstanceState()
  3. 避免内存泄漏

    • 不要在Activity中长时间持有Context引用
    • 及时注销广播接收器和服务绑定
  4. 性能优化

    • 减少onCreate()中的耗时操作
    • 使用异步任务加载数据
  5. 状态管理

    • 清晰区分临时状态和持久状态
    • 合理使用ViewModel保存UI相关数据

Application与Activity生命周期的交互

  1. 启动顺序

    • Application.onCreate()
    • Activity.onCreate()
    • Activity.onStart()
    • Activity.onResume()
  2. 退出顺序

    • Activity.onPause()
    • Activity.onStop()
    • Activity.onDestroy()
    • (可能)Application.onTerminate()(仅模拟器)
  3. 全局与局部

    • Application生命周期管理全局资源
    • Activity生命周期管理UI相关资源

高级主题

进程生命周期

Android应用进程有自己的生命周期,与Application和Activity生命周期相关但不相同:

  1. 前台进程:拥有用户正在交互的Activity
  2. 可见进程:拥有可见但非前台的Activity
  3. 服务进程:运行已启动服务的进程
  4. 后台进程:不含任何活动组件的进程
  5. 空进程:缓存进程,为提升启动速度保留

任务和返回栈

Activity在任务(Task)和返回栈(Back Stack)中的行为影响生命周期:

  • 新Activity入栈时,前一个Activity的onPause()被调用
  • 当用户返回时,栈顶Activity被销毁,下一个Activity恢复

启动模式对生命周期的影响

Activity的启动模式(launchMode)会影响生命周期:

  1. standard:默认模式,总是创建新实例
  2. singleTop:如果已在栈顶则重用
  3. singleTask:在任务中保持唯一实例
  4. singleInstance:单独任务中的唯一实例

调试与日志记录

建议为每个生命周期方法添加日志:

private static final String TAG = "Lifecycle";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate");
    // ...
}

使用Android Studio的Lifecycle观察工具可以直观查看生命周期变化。

常见问题与解决方案

  1. Activity重建导致数据丢失

    • 使用onSaveInstanceState()保存临时状态
    • 使用ViewModel保存UI相关数据
  2. 内存泄漏

    • 避免非静态内部类持有Activity引用
    • 使用WeakReference或静态类
  3. 生命周期方法执行顺序混乱

    • 确保先调用super方法
    • 避免在生命周期方法中执行耗时操作
  4. 配置变更处理不当

    • 使用android:configChanges属性控制处理方式
    • 或妥善保存和恢复状态

总结

深入理解Application和Activity生命周期是成为优秀Android开发者的基础。合理管理生命周期可以:

  • 提高应用性能
  • 减少内存使用
  • 提供更好的用户体验
  • 避免常见问题如内存泄漏和数据丢失

建议在实际开发中结合日志和性能分析工具,不断优化生命周期管理策略。

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

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

相关文章

【金仓数据库征文】金仓数据库:开启未来技术脑洞,探索数据库无限可能

我的个人主页 我的专栏: 人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!! 点赞👍收藏❤ 目录 引言:数据库进化的下一站 —— 未来科技的无限可能金仓数据库简介:国…

微信小程序根据图片生成背景颜色有效果图

效果图 取得是图片中间10个像素算出背景颜色 .wxml <canvas type"2d" id"imageCanvas" style"--w: {{w}}px;--h: {{h}}px;" /> <view style"background: {{backgroundColor}};"><image bind:tap"updateIndex&qu…

Redis ⑥-string | hash | list

string类型基本介绍 Redis 中的字符串&#xff0c;是直接按照二进制的方式进行存储的。也就是说&#xff0c;在存取的过程中&#xff0c;是不会做任何编码转换的。存的是啥&#xff0c;取的时候就是啥。 Redis 的这个机制&#xff0c;就使得 Redis 非常适合用来存储各种各样的…

深入理解C语言函数之模拟实现strcpy()strcat()

文章目录 前言一、strcpy的模拟实现二、strcat的模拟实现总结 前言 前面我们用三种方法模拟实现了一下strlen&#xff0c;所以这篇文章模拟实现以下strcpy&#xff08;&#xff09;strcat&#xff08;&#xff09; 一、strcpy的模拟实现 首先我们去官网找到strcpy的用法和原…

大数据组件学习之--Kafka 安装搭建

一、前置环境 在搭建kafka之前&#xff0c;请确认自己的hadoop、zookeeper是否搭建完成且可正常运行 二、下载并上传安装包&#xff08;链接为百度网盘&#xff09; kafka安装包 tar -zxvf /opt/software/kafka_2.12-2.4.1.tgz -C /opt/module/ 进入解压后的目录更改文件名…

BIOS主板(非UEFI)安装fedora42的方法

BIOS主板(非UEFI)安装fedora42的方法 现实困难&#xff1a;将Fedora-Workstation-Live-42-1.1.x86_64.iso写入U盘制作成可启动U盘启动fedora42&#xff0c;按照向导将fedora42安装到真机的sda7分区中得到报错如下内容&#xff1a; /boot/efi 必需的 /boot/efi必须位于格式化为e…

[吾爱出品] 【键鼠自动化工具】支持识别窗口、识图、发送文本、按键组合等

键鼠自动化工具 链接&#xff1a;https://pan.xunlei.com/s/VOOhDZkj-E0mdDZCvo3jp6s4A1?pwdfufb# 1、增加的找图点击功能&#xff08;不算增加&#xff0c;只能算缝补&#xff09;&#xff0c;各种的不完善&#xff0c;但是能运行。 2、因为受限于原程序的界面&#xff0c;…

图解YOLO(You Only Look Once)目标检测(v1-v5)

1. YOLO系列整体介绍 YOLO属于深度学习经典检测方法中的单阶段&#xff08;one - stage&#xff09;类型&#xff0c;与两阶段&#xff08;two - stage&#xff0c;如Faster - rcnn、Mask - Rcnn系列&#xff09;方法相对。 不同模型性能 单阶段方法的最核心优势是速度非常快…

基于AI应用创业IDEA:使用百度搜索开放平台的MCP广场智能推荐MCPServices服务

基于AI应用创业IDEA&#xff1a;使用百度搜索开放平台的MCP广场智能推荐MCPServices服务 在当今快速发展的技术时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为推动各行各业创新的关键力量。特别是在创业领域&#xff0c;AI技术不仅能够帮助提升产品性能&#xf…

WebRTC服务器Coturn服务器的管理平台功能

1、概述 开源的webrtc服务器提供管理平台功能&#xff0c;用户可以通过web页面进行访问配置coturn服务器&#xff0c;主要包括管理平台功能和telnet的管理功能&#xff0c;coturn相当于telnet服务器&#xff0c;可能通过配置来开启这两个功能&#xff0c;方便查看coturn服务器…

户外监控起雾终结者:PD3电解除湿器全方位解决方案

一、监控画面模糊&#xff1f;潮湿正在侵蚀您的安防系统&#xff01; 清晨的浓雾中&#xff0c;监控画面逐渐模糊&#xff1b;暴雨过后&#xff0c;摄像头内部凝结水珠&#xff1b;冬季温差导致镜头起雾&#xff0c;关键画面完全丢失...这些场景每天都在全国各地的安防系统中上…

[mysql]数据类型精讲

目录 数据类型精讲: 整数类型 浮点类型 日期和时间类型 文本字符串类型 数据类型精讲: 精度问题:不能损失数据 性能问题:表的设计,范式的讲解. 表设计的时候需要设置字段,我们现在要把字段类型讲完.,细节点一点点给大家拆解. Float和double是有精度的损失的,这边推荐使用…

并发设计模式实战系列(7):Thread Local Storage (TLS)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第七章Thread Local Storage (TLS)&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. TLS内存模型 2. 关键特性 二、生活化类比&a…

Tailwind CSS 实战:基于 Kooboo 构建企业官网页面(一)

目录 一、技术选型&#xff1a;为什么选择Tailwind Kooboo&#xff1f; 二、CDN方案 vs 传统安装 三、CDN方式实战步骤 一、技术选型&#xff1a;为什么选择Tailwind Kooboo&#xff1f; 1.1 黄金组合优势 Tailwind CSS&#xff1a;原子化CSS框架&#xff0c;提供&#x…

Bolsig+超详细使用教程

文章目录 Bolsig介绍Bolsig的使用 Bolsig介绍 BOLSIG 是一款用于求解弱电离气体中电子玻尔兹曼方程的免费计算程序&#xff0c;适用于均匀电场条件下的群体实验、气体放电及碰撞型低温等离子体研究。在此类环境中&#xff0c;电子分布函数呈现非麦克斯韦特性&#xff0c;其形态…

uni-app云开发总结

uni-app云开发总结 云开发无非就三个概念&#xff1a;云数据库、云函数、云存储 uni-app中新增了一个概念叫做云对象&#xff0c;它其实就是云函数的加强版&#xff0c;它是导出的一个对象&#xff0c;对象中可以包含多个操作数据库的函数&#xff0c;接下来咱们就详细对uni-…

《ATPL地面培训教材13:飞行原理》——第7章:失速

翻译&#xff1a;刘远贺&#xff1b;工具&#xff1a;Cursor & Cluade 3.7 第7章&#xff1a;失速 目录 引言失速的原因升力曲线失速恢复接近失速时的飞机行为接近失速时的飞行控制使用失速识别失速速度失速警告人工失速警告装置基本失速要求&#xff08;EASA和FAR&…

在html中如何创建vue自定义组件(以自定义文件上传组件为例,vue2+elementUI)

1、先上代码&#xff1a;vueUpload.js var dom <div class"upload-file"><el-upload :action"uploadFileUrl" :before-upload"handleBeforeUpload" :file-list"fileList" :limit"limit":on-error"handleUpl…

《使用 Cesium 加载静态热力图显示的实现步骤》

Cesium——使用cesium 加载静态热力图显示 实现思路 要在 Cesium 中加载静态热力图&#xff0c;我们需要完成以下几个主要步骤&#xff1a; 1、计算热力图数据的四至范围和中心点。 2、初始化热力图并设置相关参数。 3、将数据添加到热力图中。 4、定位到热力图的位置并刷…

mfc学习(一)

mfc为微软创建的一个类qt框架的客户端程序&#xff0c;只不过因为微软目前有自己 的亲身儿子C#&#xff08;.net&#xff09;,所以到2010没有进行维护。然后一些的工业企业还在继续进行维护相关的内容。我目前就接手一个现在这样的项目&#xff0c;其实本质与qt的思路是差不多的…