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

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.xdnf.cn/news/14936.html

相关文章:

  • JSP数据交互
  • JAVA如何实现Redis同步
  • 软件发布的完整流程梳理
  • 每日mysql
  • Debezium:一款基于CDC的开源数据同步工具
  • 如何使用Pytest进行测试?
  • Ubuntu22.04 设置显示存在双屏却无法双屏显示
  • MS32C001-C单片机,32位ARM M0+内核,宽电压、低功耗、小封装。
  • 【图像处理基石】如何检测到画面中的ppt并对其进行增强?
  • 【问题思考总结】两个向量之和的二范数公式是什么?
  • Shell 脚本0基础教学(一)
  • 景观桥 涵洞 城门等遮挡物对汽车安全性的影响数学建模和计算方法,需要收集那些数据
  • Windows Subsystem for Linux (WSL):现代开发的终极跨平台方案
  • 专题一_双指针_有效三角形的个数
  • 【Linux | 网络】socket编程 - 使用TCP实现服务端向客户端提供简单的服务
  • 通过Tcl脚本命令:set_param labtools.auto_update_hardware 0
  • Spring Cloud服务注册与发现:架构设计与技术实践深度分析
  • VS Code侧边栏的“资源管理器找不到解决办法“、VScode重置视图位置/还原默认视图位置
  • Linux建立本地软件仓库
  • Spring Boot 扩展点深度解析:设计思想、实现细节与最佳实践
  • 【Oracle报错】[INS-13001] 环境不满足最低要求。
  • MySQL8.0基于GTID的组复制分布式集群的环境部署
  • Rust赋能美团云原生DevOps实践
  • uni-app uni-push 2.0推送图标不展示问题
  • 【HarmonyOS6】获取华为用户信息
  • 2025年人工智能、虚拟现实与交互设计国际学术会议
  • 客户端与服务端数据加密方案及实现
  • 1️⃣理解大语言模型
  • 深度学习——损失函数
  • 使用python 将多个docx文件合并为一个word