Android 核心组件与核心设计思想
由浅入深,从四大组件、应用骨架到设计哲学与最佳实践,系统梳理 Android 核心组件体系与架构思想
一、基本概念
1.1 什么是 Android 核心组件?
Android 核心组件是系统提供的、用于构建应用的基本构建块。应用由多个组件组成,组件之间通过 Intent 和 Binder 等机制协作,由系统负责创建、调度和生命周期管理。
1 | ┌─────────────────────────────────────────────────────────────────────────┐ |
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 | ┌─────────────────────────────────────────────────────────────────────────┐ |
- 与 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_COMPLETED、ACTION_BATTERY_LOW、CONNECTIVITY_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 | 显式:我知道要启动谁 → setComponent / setClassName |
- 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 | ┌─────────────────────────────────────────────────────────────────────────┐ |
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 等现代组件与工具。
Android 核心组件与核心设计思想
https://bitgarden.cn/2020/12/01/Android/Android-核心组件与核心设计思想/