Android 核心组件与核心设计思想

由浅入深,从四大组件、应用骨架到设计哲学与最佳实践,系统梳理 Android 核心组件体系与架构思想


一、基本概念

1.1 什么是 Android 核心组件?

Android 核心组件是系统提供的、用于构建应用的基本构建块。应用由多个组件组成,组件之间通过 IntentBinder 等机制协作,由系统负责创建、调度和生命周期管理。

1
2
3
4
5
6
7
8
9
10
11
12
13
┌─────────────────────────────────────────────────────────────────────────┐
│ Android 应用 = 组件的组合与协作 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 四大组件 │
│ Activity / Service / BroadcastReceiver / ContentProvider │
│ │ │
│ ▼ │
│ Intent(意图)──► 组件间通信、启动、数据传递 │
│ Context(上下文)──► 访问资源、启动组件、获取系统服务 │
│ Application ──► 进程级单例,应用全局状态与初始化 │
│ │
└─────────────────────────────────────────────────────────────────────────┘

1.2 为什么是「组件化」?

Android 没有「一个 main 入口跑到底」的传统应用模型,而是采用 组件化 + 系统调度

设计点 说明
可复用 任意应用可通过 Intent 启动其他应用的 Activity(如调起相机、地图),无需链接其代码
可替换 同一种组件类型可有多个实现(如多个浏览器),用户或系统可选择
生命周期由系统管 组件由系统创建与销毁,便于在内存紧张时回收、在配置变更时重建
安全与隔离 组件运行在应用进程内,通过权限与 Intent 过滤控制谁能调谁

二、四大核心组件

2.1 Activity:界面与用户交互

Activity 代表一个「界面」或「屏幕」。用户看到的每一个全屏/窗口化界面,通常对应一个 Activity(或 Fragment 承载的视图)。

要点 说明
职责 提供 UI、处理用户输入、与用户交互
生命周期 onCreate → onStart → onResume → (运行中) → onPause → onStop → onDestroy
启动方式 其他 Activity 或应用通过 startActivity(Intent) 启动
任务栈 多个 Activity 组成「返回栈」,Back 键按栈顶依次退出
1
2
3
4
5
6
7
8
9
10
11
12
┌─────────────────────────────────────────────────────────────────────────┐
│ Activity 典型生命周期(简化) │
│ │
│ 创建 ──► onCreate() ──► onStart() ──► onResume() ──► 可见且可交互 │
│ │ │
│ ▼ │
│ 切到后台 / 被遮挡 ──► onPause() ──► onStop() │
│ │ │
│ 再次回到前台 ──► onRestart() ──► onStart() ──► onResume() │
│ │
│ 销毁 ──► onDestroy() │
└─────────────────────────────────────────────────────────────────────────┘
  • 与 Fragment 的关系:一个 Activity 可包含多个 Fragment,Fragment 是「界面片段」,用于在同一个 Activity 内做模块化 UI 与复用。

2.2 Service:后台任务与长期运行

Service 用于在「无界面」的情况下执行长时间运行的任务,或为其他组件提供后台能力(如播放音乐、下载、同步)。

类型 说明 典型场景
Started Service 由 startService() 启动,可长期运行直到 stopSelf() 或 stopService() 音乐播放、下载、上传
Bound Service 由 bindService() 绑定,为其他组件提供 C/S 式接口,无客户端绑定后可由系统回收 本地 SDK、数据服务、AIDL 服务
  • 生命周期:onCreate → onStartCommand(Started)或 onBind(Bound)→ 运行 → onUnbind / onDestroy。
  • 前台服务:若需长时间在后台运行且不被系统轻易杀死,可调用 startForeground() 并显示持久通知,符合系统对「前台服务」的规范。

2.3 BroadcastReceiver:事件广播与响应

BroadcastReceiver 用于接收系统或应用发出的「广播」(如开机完成、网络变化、电量低、自定义事件),并做轻量级响应。

要点 说明
注册方式 静态注册(AndroidManifest.xml)或动态注册(代码中 registerReceiver)
执行 主线程、短时执行;耗时逻辑应交给 Service 或 WorkManager
有序广播 可指定优先级与「截断」传播(abortBroadcast)

常见系统广播:ACTION_BOOT_COMPLETEDACTION_BATTERY_LOWCONNECTIVITY_ACTION 等。

2.4 ContentProvider:数据抽象与跨进程共享

ContentProvider 对数据提供统一的「增删改查」接口(类似小型数据库 API),并支持跨应用、跨进程访问,是 Android 中「数据共享」的标准方式。

要点 说明
职责 封装数据源(SQLite、文件、内存、网络),对外提供 URI 与 Cursor/ContentValues API
跨进程 底层通过 Binder 暴露,其他应用通过 ContentResolver 访问,无需直接依赖实现方
权限 可在 AndroidManifest 中为 Provider 声明读写权限,由系统做权限校验

系统示例:通讯录、媒体库、设置等,均通过 ContentProvider 暴露给其他应用。


三、支撑性核心:Intent、Context、Application

3.1 Intent:意图与组件间通信

Intent 表示「要做的一件事」或「要传递的一包信息」,用于启动 Activity/Service、发送广播,并携带数据与标志。

类型 说明 典型用法
显式 Intent 指定 ComponentName(包名 + 类名),明确启动哪个组件 应用内页面跳转、指定 Service
隐式 Intent 只指定 action、category、data(可选),由系统根据各组件声明的 <intent-filter> 匹配 调起相机、分享、打开链接、跨应用启动
1
2
显式:我知道要启动谁 → setComponent / setClassName
隐式:我只描述「要做什么」→ setAction / addCategory / setData,系统找合适的组件
  • Intent 可携带:Bundle 数据、Extra、Flags(如 FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_SINGLE_TOP)等,是组件间解耦通信的载体。

3.2 Context:上下文与资源访问

Context 是「当前组件/应用所在环境」的抽象,提供:

  • 访问应用资源(布局、字符串、drawable、主题等)
  • 启动组件(startActivity、startService、sendBroadcast)
  • 获取系统服务(getSystemService:如 LayoutInflater、ActivityManager、LocationManager)
  • 访问应用专属目录与 SharedPreferences 等
常见实现 说明
Activity Activity 本身是 Context,且带有「界面/任务」相关能力(如 startActivityForResult)
Application 进程级单例 Context,生命周期等于进程,适合做全局初始化与单例持有
Service Service 也是 Context,但无界面相关 API

注意:长时间持有 Activity 的 Context 容易导致内存泄漏(如静态变量引用 Activity),在异步回调中应避免;可改用 Application Context 或弱引用。

3.3 Application:应用级单例

Application 在进程启动时由系统创建,且每个进程只有一个实例。常用作:

  • 应用级初始化(SDK、全局配置、数据库等)
  • 全局单例或依赖注入容器的持有
  • 实现 Application 级别的生命周期回调(如 onConfigurationChanged)

在 AndroidManifest.xml 中通过 <application android:name=".MyApplication"> 指定自定义子类。


四、核心设计思想

4.1 组件化与「应用即组件集合」

Android 不强调「一个程序从 main 开始跑」,而是强调:

  • 应用由多个组件构成,每个组件有明确类型(Activity/Service/…)和声明(AndroidManifest)。
  • 入口是「可被系统或其它应用调用的组件」:例如 LAUNCHER Activity、可被隐式 Intent 匹配的 Activity/Service。
  • 组件之间通过 Intent 解耦:调用方只表达「意图」,不直接依赖实现类,便于复用与替换。
1
2
3
4
5
6
7
8
9
10
11
12
┌─────────────────────────────────────────────────────────────────────────┐
│ 组件化思想:应用 = 组件 + 声明 + 意图驱动 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ AndroidManifest.xml 声明组件与 Intent-Filter │
│ │ │
│ ▼ │
│ 系统 / 其他应用 ──► 发出 Intent ──► 系统解析 ──► 创建并启动对应组件 │
│ │
│ 同一「动作」可有多个实现(如多个浏览器),用户或系统选择其一 │
│ │
└─────────────────────────────────────────────────────────────────────────┘

4.2 生命周期由系统托管

组件的创建、暂停、恢复、销毁由 系统 根据用户行为、系统资源、配置变更(如旋转、多窗口、语言切换)统一调度:

  • 开发者实现生命周期回调(如 Activity 的 onPause/onResume),在「合适的时机」保存状态、释放资源、恢复 UI。
  • 系统可在内存紧张时回收后台组件;配置变更时销毁并重建 Activity,通过 onSaveInstanceState / ViewModel 等恢复状态。

这种设计把「何时创建/销毁」交给系统,应用只响应「已经发生」的生命周期事件,便于多任务与资源管理。

4.3 安全与权限模型

  • 进程隔离:每个应用默认运行在独立进程,内存与执行空间隔离。
  • 组件级权限:可在 AndroidManifest 中为 Activity/Service/ContentProvider 等声明 android:permission,调用方需具备相应权限才能启动或访问。
  • 运行时权限:危险权限(如相机、位置、存储)需在运行时向用户申请,用户同意后应用才可使用。
  • Intent 与导出:组件可设为 android:exported="true/false",控制是否允许其他应用通过隐式 Intent 调起。

4.4 多任务与任务栈

  • 任务(Task):通常对应用户概念里的「一个应用的一组界面」,由一组 Activity 的栈组成。
  • 启动模式:Activity 的 launchMode(standard、singleTop、singleTask、singleInstance)以及 Intent 的 Flags 共同决定「新 Activity 如何入栈、是否复用已有实例」,从而影响返回栈行为与多任务表现。

五、从设计思想到最佳实践

5.1 用 Intent 做解耦

  • 应用内跳转:可用显式 Intent,也可用隐式 Intent + 自定义 action,便于后续替换实现或做 Deep Link。
  • 跨应用能力:尽量用系统或公共的 action/data 约定(如 VIEW + http/https),或在自己的 Provider/Activity 上声明清晰的 intent-filter,便于被系统或其他应用发现和调起。

5.2 生命周期与状态保存

  • 短时状态:在 onSaveInstanceState 中保存,在 onCreate/onRestoreInstanceState 中恢复。
  • 界面相关数据:使用 ViewModel + LiveData/StateFlow,在配置变更时保留,避免在 Activity 里堆业务状态。
  • 释放资源:在 onPause/onStop 中暂停耗时操作、释放监听与引用,在 onDestroy 中做最终清理,避免泄漏。

5.3 Service 与后台行为规范

  • 短时任务:优先用 WorkManager协程 + 应用前后台状态,避免长时间占住 Service。
  • 需要长时间运行且用户可感知(如音乐播放、导航):使用 前台 Service,并按规定显示通知。
  • 避免在 BroadcastReceiver 中做重活:应启动 Service 或提交到 WorkManager。

5.4 架构分层与组件角色

  • Activity/Fragment:只做 UI 与用户输入,将业务与数据交给 ViewModel 或 Presenter。
  • ViewModel:持有界面状态与业务逻辑入口,不持有 Context/View,便于测试与复用。
  • Repository / UseCase:封装数据来源(网络、本地、ContentProvider),对上层提供统一接口。
  • ContentProvider:仅在需要「跨应用/跨进程共享数据」时使用;应用内本地数据可用 Room + DAO 等,不必强行上 Provider。

六、小结

主题 要点
四大组件 Activity(界面)、Service(后台)、BroadcastReceiver(广播)、ContentProvider(数据抽象与跨应用共享)
支撑核心 Intent(意图与组件通信)、Context(资源与系统服务)、Application(进程级单例)
设计思想 组件化、系统托管生命周期、Intent 驱动与解耦、安全与权限、任务栈与多任务
实践方向 善用 Intent 解耦、重视生命周期与状态保存、规范使用 Service 与后台、UI 与业务分层

理解「应用即组件的组合」「生命周期由系统托管」「Intent 表达意图、系统负责匹配与调度」,就能更好地把握 Android 核心组件与设计思想,并在此基础上用好 ViewModel、WorkManager、Jetpack 等现代组件与工具。

Author

Felix Tao

Posted on

2020-12-01

Updated on

2020-12-01

Licensed under