当前位置: 首页 > news >正文

android activity生命周期温习

一 activity生命周期

Android 中 Activity 的生命周期由一系列回调方法组成,描述了一个 Activity 从创建到销毁的全过程。掌握这些生命周期方法对于正确管理资源、避免内存泄漏、保持良好用户体验非常重要。


📌 Android Activity 生命周期概览

生命周期方法顺序如下:

onCreate() → onStart() → onResume()↓           ↑        ↑onRestart() ← onStop() ← onPause()↓onDestroy()

🔍 生命周期方法说明:

方法描述
onCreate()Activity 第一次被创建时调用。应该在这里进行初始化操作,比如设置布局 setContentView()、初始化 View、绑定 ViewModel 等。
onStart()Activity 对用户 可见 但还没有获取焦点时调用(还不能与用户交互)。此时可以开始注册广播、绑定服务。
onResume()Activity 完全出现在前台、可与用户交互 时调用(获得焦点)。适合开始动画、播放视频等。
onPause()当另一个 Activity 进入前台时,此方法被调用。此时应暂停动画、存储临时数据、释放资源(如摄像头)。注意:它 必须非常快,因为它不会阻塞下一个 Activity 的启动。
onStop()Activity 完全不可见(被另一个全屏 Activity 覆盖或被关闭)时调用。适合释放大量资源、断开网络连接、取消监听等。
onRestart()ActivityonStop 状态重新启动(例如用户点击“返回”按钮)时调用。
onDestroy()Activity 被销毁前调用,可以做最终清理(但不一定总会被调用,比如系统直接杀死进程)。

🧠 onStop() 方法何时被调用?

✅ 触发 onStop() 的典型场景:

  1. 启动另一个 Activity(全屏)或切换到另一个 app:

    startActivity(Intent(this, AnotherActivity::class.java)) // 当前 Activity 会调用 onStop()
    
  2. 按 Home 键 让 app 进入后台(Activity 不可见)

  3. 锁屏 或接到电话(屏幕黑屏)

  4. finish() 当前 Activity,也会先调用 onStop → onDestroy

  5. 屏幕旋转 导致 Activity 被销毁并重新创建(旧 Activity 会走 onStop → onDestroy)

  6. 多窗口模式下,当前窗口完全不可见


❗注意:

  • onStop() 之后,Activity 不再可见,但可能仍在内存中保留,有机会恢复

  • 如果用户返回此 Activity,则会调用:

    onRestart() → onStart() → onResume()
    

✅ 示例:完整生命周期日志

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)Log.d("LifeCycle", "onCreate")
}override fun onStart() {super.onStart()Log.d("LifeCycle", "onStart")
}override fun onResume() {super.onResume()Log.d("LifeCycle", "onResume")
}override fun onPause() {super.onPause()Log.d("LifeCycle", "onPause")
}override fun onStop() {super.onStop()Log.d("LifeCycle", "onStop")
}override fun onDestroy() {super.onDestroy()Log.d("LifeCycle", "onDestroy")
}

当 Android 应用退到后台时,调用 onPause()onStop() 是完全正常的、符合生命周期规范的行为


✅ 退到后台时的生命周期流程

当用户执行以下操作使 app 退到后台:

  • 按下 Home 键
  • 切换到其他 App;
  • 屏幕锁定(锁屏);
  • 使用多任务按钮滑动切换到其他 App;

此时,当前 Activity 的生命周期如下所示:

onPause() → onStop()

🔍 两个方法作用区别

生命周期方法说明触发时机
onPause()Activity 失去焦点但仍可见。适合释放 UI 相关资源(如动画、传感器等),保存少量轻量数据。马上有其他 Activity 覆盖或部分遮挡时
onStop()Activity 完全不可见。适合释放重量级资源,如断开网络连接、解绑服务、停止摄像头等。被完全遮挡或进入后台

✅ 示例:按 Home 键退到后台

→ onPause()
→ onStop()

✅ 示例:跳转到另一个全屏 Activity

A.onPause()
A.onStop()
B.onCreate()
B.onStart()
B.onResume()

❗特别注意

  • onPause() 一定在 onStop() 之前执行。
  • 它们是进入后台前的“清理和暂停”时机,千万不要做耗时操作,尤其是 onPause(),它必须尽快返回。

🧠 小贴士

  • 如果需要判断 app 是否进入后台,可以结合 onStop() 与前后台检测方案(如 ProcessLifecycleOwner.get().lifecycle)。
  • onStop() 里适合处理数据保存、资源释放等操作。

✅ 总结

问题回答
App 退到后台是否会调用 onPause()onStop()✅ 是的,这是生命周期的正常行为。

在 Android 中,Activity 的生命周期方法 onDestroy()不会在 onStop() 之后立即或必然执行,其是否执行取决于系统是否需要销毁该 Activity 实例。

具体来说,onDestroy() 的执行时机如下:


✅ 会执行 onDestroy() 的典型情况:

  1. 用户主动销毁 Activity:

    • 调用 finish() 方法时,onDestroy() 会被立即触发。

    • 例如:

      startActivity(Intent(this, AnotherActivity::class.java))
      finish() // 当前 Activity 会执行 onDestroy()
      
  2. 系统资源紧张,回收后台 Activity:

    • 如果 Activity 已经进入 onStop() 状态(即不可见),系统可能会因为资源压力而回收内存,销毁 Activity,此时也会调用 onDestroy()
  3. 配置发生变化(如旋转屏幕),且未处理:

    • 若未声明 android:configChanges 或未处理 onConfigurationChanged(),系统会销毁并重新创建 Activity。
    • 会先调用 onPause()onStop()onDestroy(),再走一遍 onCreate() 等流程。

❌ 不会执行 onDestroy() 的情况:

  • Activity 被置于后台但进程仍存活
    • 如果用户按 Home 键或打开了其他 App, Activity 会进入 onStop() 状态,但不会立即 onDestroy(),系统会保留该实例以便用户返回时快速恢复。

可视化流程(简化):

Running↓  [按Home或启动新Activity]
onPause()↓
onStop()   ← Activity仍在后台↓ [finish() or 被系统杀死]
onDestroy()

补充建议:

  • 若在 onDestroy() 中释放资源,确保也在 onStop() 中处理关键资源释放(如相机、传感器、网络连接等),避免泄漏。

  • 可使用 isFinishing() 判断是否为用户主动关闭:

    override fun onDestroy() {if (isFinishing) {// 用户主动关闭} else {// 系统销毁(如旋转、低内存)}
    }
    

在这里插入图片描述

参考:
https://blog.csdn.net/weixin_46139477/article/details/123865147

http://www.dtcms.com/a/271359.html

相关文章:

  • Java HashMap 的 get 和 put 方法的实现流程
  • android——热修复(补丁)
  • 微软官方C++构建工具:历史演变、核心组件与现代实践指南
  • SQL注入:现象、本质与防御详解
  • 文本标签提取与大模型理解:方法论深度指南
  • Kubernetes 集群部署、配置和验证-使用kubeadm快速部署一个K8s集群_笔记
  • 【K8S】在 Kubernetes 上配置安装 Nginx Ingress 控制器指南
  • 使用LLaMA-Factory微调Qwen2.5-VL-3B 的目标检测任务-LLaMA-Factory训练数据配置
  • 图像处理中的霍夫变换:直线检测与圆检测
  • 【软件运维】前后端部署启动的几种方式
  • 区块链系统开发技术应用构建可信数字生态链
  • 股指期货交割日避坑指南
  • 【MkDocs踩坑】图片路径问题的排查与解决
  • 由 DB_FILES 参数导致的 dg 服务器无法同步问题
  • 【动手学深度学习】4.10 实战Kaggle比赛:预测房价
  • Android API Level 到底是什么?和安卓什么关系?应用发布如何知道自己的版本?优雅草卓伊凡
  • 深度学习预备知识
  • MyBatisPlus-03-扩展功能
  • 基于Matlab多特征融合的可视化指纹识别系统
  • 常见 HTTP 方法的成功状态码200,204,202,201
  • whitt算法之特征向量的尺度
  • 利用编码ai工具cursor写单元测试
  • springMVC06-注解+配置类实现springMVC
  • Java位运算
  • Electron的setContentProtection()会被哪个层级的API捕获?
  • 【TCP/IP】3. IP 地址
  • 储能系统防孤岛保护测试:电网安全的“守门人”
  • C#字符串相关库函数运用梳理总结 + 正则表达式详解
  • 基于YOLOv11的CF-YOLO,如何突破无人机小目标检测?
  • 光伏无人机3D建模:毫秒级精度设计