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)。

Activity 的启动流程

Service