【Activity】Android Activity详解

Activity是Android四大组件之一,作为用户介乎的界面载体,承担着展示UI、处理用户输入、管理页面生命周期的核心职责,是理解Android应用架构的基础。

一、简介

Activity是Android系统中用于与用户交互的组件,一个Activity通常对应应用中的一个独立屏幕,也可以理解为一个界面,如登录页、主页、设置页等。但是它不等于界面本身,而是在界面背后复杂加载布局、处理交互、管理状态、协调Fragment/Compose等内容的"控制器"。

Activity由系统统一调度,其生命周期完全受系统回调控制,开发者通过覆写回调方法来响应不同阶段的事件。

一个应用可以有多个Activity,应用通过AndroidManifest.xml声明Activity,并在主Activity上配置<action android:name="android.intent.action.Main"/> 与<category android:name="android.intent.category.LAUNCHER" />,才能在桌面显示图标并启动应用。

通常在创建一个应用是会自动生成配置代码。

二、生命周期

Activity有七大生命周期,定义了七个核心回调方法,每个方法对应生命周期的特定阶段。

理解生命周期是非常重要的,这奠定了开发基础。

2.1 七大生命周期回调

回调方法 调用时机 典型职责
onCreate() Activity 第一次被创建 加载布局、绑定视图、初始化 ViewModel、恢复 savedInstanceState
onStart() Activity 由不可见变为可见 注册 UI 相关监听
onResume() Activity 位于栈顶、可与用户交互 启动相机、传感器、动画等前台资源
onPause() Activity 失去焦点,部分可见 暂停动画、保存关键数据,必须快速执行
onStop() Activity 完全不可见 释放重量级资源(如 GPS、广播)
onRestart() Activity 由停止态重新回到前台 一般无需处理,系统随后回调 onStart
onDestroy() Activity 被销毁前调用 最终清理、解除所有绑定

生命周期流程图如下:

2.2 三种生存周期划分

为了便于理解与资源管理,生命周期可以划分为三个同心区间。

  1. 完整生存期:onCreate()->onDestroy()之间,通常在onCreate完成初始化,在onDestroy()释放全部资源。
  2. 可见生存期:onStart()->onStop()之间,Activity对用户可见,但不一定可交互,适合管理UI相关资源。
  3. 前台生存期:onResume()->onPause()之间,Activity处于前台且与用户可交互,是应用真正"活跃"的阶段。

2.3典型场景的回调顺序

场景 回调顺序
正常启动 onCreate → onStart → onResume
正常退出 onPause → onStop → onDestroy
打开新 Activity 旧:onPause → onStop;新:onCreate → onStart → onResume
返回到上一页 新:onPause → onStop → onDestroy;旧:onRestart → onStart → onResume
按 Home 键回桌面 onPause → onStop
回到应用 onRestart → onStart → onResume
弹出对话框式 Activity 仅触发 onPause,不触发 onStop
屏幕旋转 onPause → onStop → onSaveInstanceState → onDestroy → onCreate → onStart → onRestoreInstanceState → onResume

三、启动模式

Activity的启动模式决定了它在任务栈中如何创建与复用实例,Activity有四种启动模式,通过AndroidManifest.xml中<activity>的android:launchMode属性指定。

启动模式 实例数 核心行为 典型应用场景
standard 多个 默认模式,每次启动都在目标栈顶创建新实例 大部分常规页面
singleTop 条件性多个 若目标 Activity 已位于栈顶则复用并回调 onNewIntent(),否则仍新建 推送详情页、登录页、支付回调页
singleTask 单例 整个任务栈中仅存在一个实例,启动时销毁其上所有 Activity 并回调 onNewIntent() 首页、主页容器、WebView、购物车
singleInstance 单例(独占任务栈) 系统为其单独创建一个任务栈,该栈内仅有它自身,跨应用共享实例 来电界面、系统 Launcher、闹钟提示

singleTask与singleInstance的唯一区别在于:singleTask允许其他Activity压入同一任务栈,而singleInstance的任务栈中永远只有它自己,从它启动的新Activity都会被放入其他任务栈。

四、其他遇到过的小问题

  1. 为什么不能在onPause中做耗时操作?
    新Activity的onResume必须等到旧Activity的onPause执行完毕后才会触发,onPause耗时会直接影响页面切换的速度。
  2. 什么情况下Activity会走onDestory但应用未退出?
    配置变更(旋转屏幕,切换语言、深色模式)、系统内存回收、finish()调用等都会触发onDestroy。
  3. 通知栏点击打开Activity会出现页面重复是什么原因?
    通常是因为PendingIntent未设置FLAG或启动模式,导致任务栈错乱。应结合FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TOP 与 launchMode 综合设计,而非仅靠 singleTop 解决。

五、总结

Activity是Android组件体系的基石,其核心逻辑可归纳为三点:

  1. 生命周期由系统回调驱动,开发者通过覆写回调达到目的;
  2. 启动模式与Task/Back Stack决定了页面如何入栈、复用与销毁,是解决页面跳转与返回错乱的关键;
  3. Bundle机制与ViewModel组合保障了状态在销毁重建时不丢失。

感谢看完全文,比心!

相关推荐
AI2中文网1 小时前
安卓 15/16 手机软键盘遮挡输入框、布局顶不上去?已解决:重新编译即可
android·智能手机
字节暗面1 小时前
Android APP 加固横评记录:爱加密、梆梆、网易易盾与腾讯 ACE
android·逆向工程·加固
落魄Android在线炒饭2 小时前
Android 实战问题反推 OpenGL 概念(上)
android·opengl
booboosui2 小时前
DeepSeek 的 Worker 调得动 GitHub,调不动微信:三类 Worker 的实现差别
android
MiyamuraMiyako3 小时前
Compose LazyRow 实现尾项露出与少量数据均分
android·android jetpack
booboosui4 小时前
输入法借 350 毫秒:给 agent 打字的两条路
android
哲鲤6 小时前
Binder 不只是 IPC:从一次跨进程调用看懂 Android 与 AAOS 的架构演进
android
用户128139778166 小时前
Eyf半字节【3.0 版】正式发布|订单、单证、扫码三大核心模块全新重构
android
device_Any7 小时前
接口文档写着三个字段,接口返回了五个
android·java·linux