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 的生命周期流程可以分为以下几个阶段:
-
启动 Activity:
onCreate()
->onStart()
->onResume()
-
切换到后台:
- 当前 Activity 调用
onPause()
,然后新的 Activity 调用onCreate()
,onStart()
,onResume()
。 - 当前 Activity 调用
onStop()
。
- 当前 Activity 调用
-
返回前台:
- 如果 Activity 没有被销毁,则调用
onRestart()
,onStart()
,onResume()
。 - 如果 Activity 被销毁,则重新调用
onCreate()
,onStart()
,onResume()
。
- 如果 Activity 没有被销毁,则调用
-
销毁 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 实战案例
-
案例一:日志记录 Activity 生命周期
- 在 Activity 的生命周期方法中添加日志输出。
- 运行应用,观察日志输出,理解 Activity 生命周期流程。
-
案例二:保存与恢复 Activity 状态
- 在 Activity 中保存文本输入框的内容。
- 旋转屏幕,观察状态是否正确恢复。
4.9 课后作业
-
任务一:观察 Activity 生命周期
- 创建一个新的 Activity,在生命周期方法中添加日志输出。
- 运行应用,执行不同的操作,例如启动 Activity、切换到后台、返回前台、销毁 Activity,观察日志输出,理解 Activity 生命周期流程。
-
任务二:管理 Activity 状态
- 在 Activity 中添加一个文本输入框。
- 在
onSaveInstanceState()
方法中保存文本输入框的内容。 - 在
onCreate()
方法中恢复文本输入框的内容。 - 旋转屏幕,观察状态是否正确恢复。
-
任务三:管理任务与回退栈
- 创建两个 Activity,ActivityA 和 ActivityB。
- 从 ActivityA 打开 ActivityB。
- 使用不同的
Intent
标志位,例如FLAG_ACTIVITY_NEW_TASK
,FLAG_ACTIVITY_CLEAR_TOP
,观察 Activity 任务和回退栈的变化。
通过本章节的学习,学员将能够理解 Activity 的生命周期方法,掌握 Activity 状态保存与恢复的方法,并能够管理 Activity 任务与回退栈,为开发稳定的 Android 应用打下基础。
作者简介
前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!
温馨提示:可搜老码小张公号联系导师