Activity
什么是 Activity?
Activity 是 Android 四大组件之一,承担着用户界面交互的核心职责。由于移动端应用涉及前后台切换、旋转、内存回收、任务栈管理等复杂情况,理解 Activity 的生命周期对于开发健壮的应用至关重要。
每个 Activity 都有一个窗口,该窗口可以全屏幕填充,也可以是一个小窗口浮动在其他窗口上。
一个应用程序通常由多个 Activity 组成,它会指定应用程序中的某个 Activity 作为主 Activity,这意味着当用户第一次启动应用程序时呈现给用户的活动,并且 Activity 可以相互跳转来执行不同的操作。
生命周期
一个 Activity 从创建到销毁,大致会经历以下主要方法:
onCreate():初始化逻辑:加载布局、初始化 ViewModel/数据源、注册监听等;
onStart():Activity 对用户可见,但还不能交互;
onResume():Activity 进入前台、获取焦点,用户可交互;
onPause():Activity 暂停,失去焦点(如弹出 Dialog 或跳转新界面)。适合保存少量数据、停止动画/传感器等;
onStop():Activity 对用户完全不可见。此时应释放较重的资源(如摄像头、传感器、广播);
onDestory():Activity 即将销毁,用于释放最后的资源,解绑引用避免内存泄漏。
可结合官方文档中的经典图示,可以发现:
onResume → onPause 属于前台可交互与失去焦点的切换;
onStart → onStop 属于可见与不可见的切换;
onCreate → onDestory 属于整个 Activity 的完整生命轨迹。
典型场景下的生命周期流程:
启动 Activity A:onCreate → onStart → onResume
在 A 页面打开新的 Activity B 时:
A:onPause → onStop
B:onCreate → onStart → onResume
按下返回键,返回 A 页面时:
A:onRestart → onStart → onResume
B:onPause → onStop → onDestory
按下 Home 键切换到桌面时,A:onPause → onStop
从桌面再次打开软件时,A:onRestart → onStart → onResume
打开任务栏时,A:onPause → onStop
从任务栏杀掉当前应用时:会直接杀死整个应用进程,不是正常销毁 Activity,因此不会产生生命周期回调。
Activity 启动方式
Android 提供了四种启动模式(LaunchMode),用于控制 Activity 在 任务栈(Task Stack) 中的行为。
从 Launcher(桌面应用)启动应用时,应用的第一个 Activity(通常是 MainActivity)会放到一个新的任务栈里。每个 Activity 可以设置不同的启动方式:
standard(默认):每次启动都会创建新的实例并入栈,适合大多数页面;
singleTop:如果目标 Activity 已位于栈顶,则复用该实例,并调用
onNewIntent()
,如果不在栈顶,则新建实例;singleTask:栈内只会存在一个实例,如果已存在则直接复用,并清除其上的其他 Activity。适合主页、搜索页等需要唯一入口的页面;
singleInstance:独立运行在一个新的任务栈中,并且该栈中只允许存在此一个 Activity。典型应用:闹钟、来电界面等全局独立页面。
搭建一个 A1 → B → A2 → A3 的页面切换场景(A1、A2、A3 表示同一个 Activity A),观察不同启动模式下的情况:
standard:B 启动的 A2 页面是新建的,A2 启动的 A3 也是新建的,从 A3 返回时:A3 → A2 → B → A1;
singleTop:B 启动 A2 时,A1 存在与任务栈中,但不是栈顶,所以 A2 页面是新建的。从 A2 启动 A3 时,A2 已经是栈顶,所以 A3 会复用 A2(不会新建),生命周期回调为:onPause → onNewIntent → onResume。返回时:A3 → B → A1
singleTask:从 A1 启动 B 页面时是常规情况(A1 到 onStop,B 到 onResume),后面的情况略有不同:
B 启动 A2 页面:由于任务栈中已经存储 Activity A 的实例了,因此会将 A 页面移至栈顶(onRestart → onStart → onNewIntent → onResume),B 页面会被弹出任务栈销毁(onPause → onStop → onDestory)。
A2 启动 A3 页面:和 singleTop 一样,Activity A 实例已经存在与栈顶了,不会创建新页面,直接复用(onPause → onNewIntent → onResume)。
singleInstance:Activity A 是单独的任务栈且只有一个实例。
B 启动 A2 页面:重新启动 A 页面(onRestart → onStart → onNewIntent → onResume),B 页面被暂停(onPause → onStop)
A2 启动 A3 页面:和 singleTop 一样,Activity A 实例已经存在与栈顶了,不会创建新页面,直接复用(onPause → onNewIntent → onResume)。
A3 返回时:A 页面从自己的任务栈中弹出被销毁(onPause → onStop → onDestory),B 页面重新启动(onRestart → onStart → onResume)。