Android 四大组件总结
整理日期:2026-07-30
四大组件:
Activity、Service、BroadcastReceiver、ContentProvider均需在
AndroidManifest.xml中声明(部分动态注册广播除外)
目录
- [1. 总览](#1. 总览)
- [2. Activity(活动)](#2. Activity(活动))
- [3. Service(服务)](#3. Service(服务))
- [4. BroadcastReceiver(广播接收器)](#4. BroadcastReceiver(广播接收器))
- [5. ContentProvider(内容提供者)](#5. ContentProvider(内容提供者))
- [6. 组件通信与 Intent](#6. 组件通信与 Intent)
- [7. Manifest 与安全要点](#7. Manifest 与安全要点)
- [8. 生命周期对照](#8. 生命周期对照)
- [9. 选型速查](#9. 选型速查)
- [10. 优缺点总览](#10. 优缺点总览)
- [11. 参考链接](#11. 参考链接)
1. 总览
| 组件 | 作用 | 有界面 | 典型启动方式 |
|---|---|---|---|
| Activity | 用户交互界面与页面 | 是 | startActivity / 系统启动 |
| Service | 后台执行长时间任务 | 否 | startService / bindService / FGS |
| BroadcastReceiver | 响应系统或应用广播事件 | 否 | 静态/动态注册后收 Intent |
| ContentProvider | 跨应用/跨进程共享结构化数据 | 否 | ContentResolver 查询操作 |
共性:
- 由系统调度,生命周期不由业务代码完全掌控
- 通过 Intent(及 Binder / ContentResolver)协作
- Android 8+ 起后台、隐式广播、导出安全限制持续收紧
2. Activity(活动)
2.1 职责
- App 的 UI 入口与页面容器(窗口 + 生命周期)
- 一个界面通常对应一个 Activity(现代项目多用 单 Activity + 多 Fragment / Compose Navigation)
2.2 生命周期(简)
onCreate → onStart → onResume ⟵ 可见可交互
↓
onPause → onStop → onDestroy
↕
onRestart(从 stop 回到前台)
| 回调 | 时机 |
|---|---|
onCreate |
首次创建,初始化 UI |
onStart |
即将可见 |
onResume |
获得焦点,可交互 |
onPause |
失去焦点(如半透明遮挡) |
onStop |
完全不可见 |
onDestroy |
销毁,释放资源 |
onSaveInstanceState |
可能被杀前保存临时 UI 状态 |
配置变更(旋转等)默认可能销毁重建;可用 ViewModel + 状态保存,或 configChanges / Compose 状态处理。
2.3 启动模式(launchMode)
| 模式 | 含义 |
|---|---|
standard |
默认,每次新建实例 |
singleTop |
栈顶已是该 Activity 则复用,走 onNewIntent |
singleTask |
任务栈内复用,其上实例出栈 |
singleInstance |
独占任务栈(少用,如桌面类) |
另有 Intent Flag:FLAG_ACTIVITY_NEW_TASK、CLEAR_TOP 等。
2.4 现代实践
- UI:Jetpack Compose / View + Fragment
- 结果回调:
Activity Result API(替代startActivityForResult) - 后台启动 Activity:Android 10+ 严格限制
- 大屏 / 边到边 / 预测性返回:随 targetSdk 强制适配
3. Service(服务)
3.1 职责
- 无界面的后台组件,执行下载、播放、同步等
- 不等于"保证一直在后台跑":受后台执行限制、Doze、厂商策略约束
3.2 类型
| 类型 | 说明 |
|---|---|
| Started Service | startService / startForegroundService,独立生命周期,需自行 stopSelf |
| Bound Service | bindService,客户端通过 Binder 通信,无绑定时可销毁 |
| 混合 | 可同时 start + bind |
| Foreground Service (FGS) | 必须持续通知;Android 8+ 后台启动受限;14+ 必须声明 foregroundServiceType |
| IntentService(已废弃) | 改为 JobIntentService(也偏旧)或 WorkManager / 协程 |
3.3 生命周期(Started)
onCreate → onStartCommand → ... → onDestroy
Bound 额外:onBind / onUnbind / onRebind。
onStartCommand 返回值:
| 返回值 | 含义 |
|---|---|
START_STICKY |
被杀后尝试重建,Intent 为 null |
START_NOT_STICKY |
被杀不重建(除非有挂起 Intent) |
START_REDELIVER_INTENT |
被杀后重建并重传最后 Intent |
3.4 现代替代
| 场景 | 更推荐 |
|---|---|
| 延时/条件任务、可延期 | WorkManager |
| 精确闹钟 | AlarmManager + 权限策略 |
| 音乐/导航/通话等用户可知晓任务 | FGS(正确 type + 通知) |
| 短时后台 | 协程 / 线程,注意进程优先级 |
4. BroadcastReceiver(广播接收器)
4.1 职责
- 监听 系统或应用发出的广播事件(开机、网络变化、自定义业务事件等)
- 回调在主线程,
onReceive内 禁止长耗时;耗时应转 Service / 协程 / WorkManager
4.2 注册方式
| 方式 | 特点 |
|---|---|
| 静态注册(Manifest) | 可在未启动时唤醒(受隐式广播限制) |
动态注册 (Context.registerReceiver) |
灵活,随组件生命周期;Android 14+ 须指定 RECEIVER_EXPORTED / NOT_EXPORTED |
4.3 限制(务必知道)
- Android 8+:大部分隐式广播不能静态注册(有白名单例外)
- 自定义广播优先 显式 Intent (指定组件/包名)或 LocalBroadcast 已废弃 → 用 Flow / LiveData / EventBus 慎用 / 进程内回调
- 有序广播、粘性广播:能力保留但场景减少
- Android 13+ 通知等相关行为变化;SMS OTP 等系统广播在高版本进一步收紧
4.4 生命周期
极短:onReceive 执行期间对象有效,返回后即可销毁。
勿在 Receiver 内异步"裸开线程"后结束(进程可能被回收);用 goAsync()(谨慎)或转交前台/Work。
5. ContentProvider(内容提供者)
5.1 职责
- 以 URI 形式对外提供数据读写(SQLite、文件、内存等)
- 系统大量使用:通讯录、媒体库、设置等
- App 内也可用 Provider 做模块解耦或 FileProvider 分享文件
5.2 核心方法
| 方法 | 作用 |
|---|---|
query |
查询 |
insert |
插入 |
update |
更新 |
delete |
删除 |
getType |
MIME 类型 |
call(可选) |
自定义 RPC 风格调用 |
客户端通过 ContentResolver 访问,不直接持有 Provider 实例(跨进程由系统 Binder 调度)。
5.3 URI 约定
content://authority/path/id
例:content://com.example.app.provider/items/42
authority 全局唯一,通常用应用包名风格。
5.4 权限与安全
android:exported:是否对外暴露readPermission/writePermission/grantUriPermissions- FileProvider :安全分享私有目录文件(替代
file://) - Android 11+ 包可见性影响查询其他 App Provider 的能力
5.5 线程
- Provider 方法常在 Binder 线程池调用,注意同步与线程安全
- 耗时查询勿阻塞;大数据量注意分页与取消
6. 组件通信与 Intent
Activity ←─ startActivity / Result API ─→ Activity
Activity ←─ start/bind Service ────────→ Service
任意组件 ←─ sendBroadcast ─────────────→ BroadcastReceiver
任意组件 ←─ ContentResolver ───────────→ ContentProvider
跨进程 ←─ AIDL / Messenger / Binder ─→ Service
| Intent 类型 | 说明 |
|---|---|
| 显式 | 指定组件类名,应用内推荐 |
| 隐式 | 靠 action/category/data 匹配;对外需 intent-filter,且注意 exported 与匹配规则(Android 12+ 更严) |
四大组件 不是 普通 Java 对象:new Activity() 无效,必须由系统创建。
7. Manifest 与安全要点
所有四大组件(除部分动态 Receiver)需声明,例如:
xml
<activity android:name=".MainActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".SyncService"
android:exported="false"
android:foregroundServiceType="dataSync" />
<receiver
android:name=".BootReceiver"
android:exported="true">
<!-- 注意隐式广播白名单限制 -->
</receiver>
<provider
android:name=".data.AppProvider"
android:authorities="${applicationId}.provider"
android:exported="false" />
| 版本相关 | 要求 |
|---|---|
| Android 12+ | 含 intent-filter 的组件必须显式 android:exported |
| Android 14+ | 动态 Receiver 必须指定导出标志;FGS 必须声明类型 |
| 通用 | 最小导出面;敏感 Provider 加权限;分享文件用 FileProvider |
8. 生命周期对照
| 组件 | 生命周期特点 |
|---|---|
| Activity | 完整可见性状态机;可重建;与任务栈绑定 |
| Service | 创建后可长期存在(受系统限制);start/bind 路径不同 |
| BroadcastReceiver | 几乎瞬时;onReceive 结束即可能销毁 |
| ContentProvider | 随进程;首次被访问时创建;方法按需调用 |
进程优先级(由高到低大致):前台 Activity > 可见 Activity > 前台服务 > Service/后台 > 空进程。组件状态影响进程是否被杀。
9. 选型速查
| 需求 | 用什么 |
|---|---|
| 展示页面、用户操作 | Activity(或 Compose 目的地) |
| 用户可感知的持续任务(音乐、导航) | Foreground Service |
| 可延期后台工作 | WorkManager(不必强行自建 Service) |
| 系统/跨应用事件通知 | BroadcastReceiver(优先动态 + 显式) |
| 跨应用共享数据 / 安全分享文件 | ContentProvider / FileProvider |
| 应用内模块传数据 | 仓库层 / DI,不必强上 Provider |
10. 优缺点总览
Activity
| 优点 | 官方 UI 入口;生命周期与系统窗口管理成熟;生态工具全 |
| 缺点 | 重建与状态保存易踩坑;多 Activity 栈管理复杂;后台启动受限 |
Service
| 优点 | 适合持续任务与跨界面逻辑;FGS 可提高优先级 |
| 缺点 | 后台限制多;易被杀;FGS 类型/超时/权限政策逐年变严 |
BroadcastReceiver
| 优点 | 解耦事件通知;可响应系统事件 |
| 缺点 | 隐式静态广播大量禁用;onReceive 短时;滥用导致难调试 |
ContentProvider
| 优点 | 标准化跨进程数据接口;权限模型清晰;FileProvider 实用 |
| 缺点 | 实现与调试成本高;URI/权限设计不当有安全风险;简单 App 内场景常过重 |
11. 参考链接
- Application fundamentals
- Activities
- Services overview
- Broadcasts
- Content providers
- Intents and intent filters
一句话: Activity 管界面,Service 管后台任务(能用 WorkManager 就别硬撑),BroadcastReceiver 管短事件,ContentProvider 管标准化数据共享;四者都由系统创建,并用 Intent / Resolver 协作,同时必须按现行后台与导出安全规则声明。