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() | 当 Activity 从 onStop 状态重新启动(例如用户点击“返回”按钮)时调用。 |
onDestroy() | Activity 被销毁前调用,可以做最终清理(但不一定总会被调用,比如系统直接杀死进程)。 |
🧠 onStop() 方法何时被调用?
✅ 触发 onStop() 的典型场景:
-
启动另一个 Activity(全屏)或切换到另一个 app:
startActivity(Intent(this, AnotherActivity::class.java)) // 当前 Activity 会调用 onStop()
-
按 Home 键 让 app 进入后台(Activity 不可见)
-
锁屏 或接到电话(屏幕黑屏)
-
finish() 当前 Activity,也会先调用 onStop → onDestroy
-
屏幕旋转 导致 Activity 被销毁并重新创建(旧 Activity 会走 onStop → onDestroy)
-
多窗口模式下,当前窗口完全不可见
❗注意:
-
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()
的典型情况:
-
用户主动销毁 Activity:
-
调用
finish()
方法时,onDestroy()
会被立即触发。 -
例如:
startActivity(Intent(this, AnotherActivity::class.java)) finish() // 当前 Activity 会执行 onDestroy()
-
-
系统资源紧张,回收后台 Activity:
- 如果 Activity 已经进入
onStop()
状态(即不可见),系统可能会因为资源压力而回收内存,销毁 Activity,此时也会调用onDestroy()
。
- 如果 Activity 已经进入
-
配置发生变化(如旋转屏幕),且未处理:
- 若未声明
android:configChanges
或未处理onConfigurationChanged()
,系统会销毁并重新创建 Activity。 - 会先调用
onPause()
→onStop()
→onDestroy()
,再走一遍onCreate()
等流程。
- 若未声明
❌ 不会执行 onDestroy()
的情况:
- Activity 被置于后台但进程仍存活:
- 如果用户按 Home 键或打开了其他 App, Activity 会进入
onStop()
状态,但不会立即onDestroy()
,系统会保留该实例以便用户返回时快速恢复。
- 如果用户按 Home 键或打开了其他 App, Activity 会进入
可视化流程(简化):
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