13.00 四大组件-组件总览
JiangMing 2025/6/13 Android 开发基础
前面章节里我们已经"用"过组件了:每个页面都是 Activity(07、08),查数据库是为了 Service 场景做准备……但一直没有系统回答:Android 应用是什么构成的? 答案就是本篇的主角——四大组件。它们是应用的功能载体,也是系统调度应用的基本单位。
# 一、全景图
| 组件 | 一句话定位 | 典型场景 | 对应章节 |
|---|---|---|---|
| Activity | 界面载体:一屏 = 一个实例 | 页面跳转、表单、列表详情 | 本篇 13.01 |
| Service | 后台执行:无界面长任务 | 音乐播放、文件上传、常驻定位 | 13.02 |
| BroadcastReceiver | 全局事件监听 | 开机自启、网络变化、应用内事件总线 | 13.03 |
| ContentProvider | 跨应用数据共享 | 读系统相册/通讯录、暴露自身数据 | 13.04 |
| Fragment(辅助) | Activity 的模块化子界面 | 单 Activity 多 Fragment 架构 | 13.05 |
# 二、最重要的共同点:组件由系统托管
四大组件与普通 Java 类的本质区别——它们不是你 new 出来的,而是系统创建的:
// ✘ 永远不要这样写:组件由系统实例化并管理生命周期
Activity activity = new MainActivity();
activity.onCreate(null); // 这不是合法的启动方式
// ✔ 组件的启动都通过"意图"声明,交给系统调度
startActivity(new Intent(this, MainActivity.class)); // 启动Activity
startService(new Intent(this, DownloadService.class)); // 启动Service
sendBroadcast(new Intent("com.example.ACTION_REFRESH")); // 发送广播
由此衍生出四条"组件宪法",贯穿本章所有内容:
- 必须注册:在
AndroidManifest.xml中声明(动态广播除外)——系统靠它知道"这个应用有哪些组件" - 生命周期由系统回调:
onCreate/onStart等都是系统在恰当时机调用的,你的任务是"实现回调"而不是"调用回调" - 进程可能被回收:组件不在前台时,宿主进程随时可能被系统杀掉回收内存——所以有状态保存机制(13.01)与前台服务机制(13.02)
- 组件间靠 Intent 通信:Activity 跳转、Service 绑定、广播发送,统一走 Intent(13 章单独立一节讲)
# 三、AndroidManifest.xml:组件的"户口本"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app">
<application
android:name=".App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.App">
<!-- Activity:launchMode在13.01详解 -->
<activity
android:name=".MainActivity"
android:exported="true" <!-- 是否允许其他应用唤起(Android 12+必须显式声明) -->
android:launchMode="standard"
android:screenOrientation="portrait">
<intent-filter> <!-- 有filter才能被外部隐式启动(如桌面图标入口) -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Service -->
<service android:name=".DownloadService" android:exported="false" />
<!-- 静态广播接收器 -->
<receiver android:name=".NetworkReceiver" android:exported="false">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<!-- ContentProvider(authorities即对外URI的域名) -->
<provider
android:name=".AppDataProvider"
android:authorities="com.example.app.provider"
android:exported="false" />
</application>
</manifest>
exported 属性要特别强调:Android 12 起含 intent-filter 的组件必须显式声明 exported(否则安装失败)。它是"安全门"——true 表示任何应用都能唤起这个组件,需要配合权限校验(15 权限机制)。
# 四、组件与进程:一个容易被误解的关系
- 默认情况下,四大组件都运行在同一个主进程的主线程(除非显式指定
android:process) - 组件不是线程:Service 收到"后台"任务照样要自己开线程(10.02);BroadcastReceiver.onReceive 也在主线程
- 进程回收以组件状态为依据:系统按"组件最近使用时间与重要性"决定回收谁——前台 Activity > 可见但非前台(被对话框遮挡)> 后台 Service > 缓存空进程。这就是"应用退到后台一段时间再回来,数据丢了"的根源(进程被杀 → 冷启动重建 → 需要状态恢复,13.01 详解)
# 五、本章分节导览
- 13.00 组件总览(本文)
- 13.01 Activity:生命周期全景与典型路径、状态保存恢复、四种启动模式与任务栈、数据传递与返回结果
- 13.02 Service:started/bound 两种形态、前台服务、生命周期对比
- 13.03 BroadcastReceiver:静态/动态注册、有序广播、Android 高版本限制
- 13.04 ContentProvider:URI 匹配、跨应用读写(以系统相册/通讯录为例)
- 13.05 Fragment:生命周期与 Activity 协作、通信方式
- 14 Intent 与组件通信:显式/隐式、IntentFilter 匹配、PendingIntent
# 结束
本节建立了组件的全局认知:四大组件的定位对比(配图)、"组件由系统托管"的四条宪法(manifest 注册、系统回调生命周期、进程可回收、Intent 通信)、manifest 注册与 exported 安全属性、组件与进程/线程的关系澄清。接下来逐个深入,从最重要的 Activity 开始:13.01 Activity。