13.00 四大组件-组件总览

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"));   // 发送广播

由此衍生出四条"组件宪法",贯穿本章所有内容:

  1. 必须注册:在 AndroidManifest.xml 中声明(动态广播除外)——系统靠它知道"这个应用有哪些组件"
  2. 生命周期由系统回调:onCreate/onStart 等都是系统在恰当时机调用的,你的任务是"实现回调"而不是"调用回调"
  3. 进程可能被回收:组件不在前台时,宿主进程随时可能被系统杀掉回收内存——所以有状态保存机制(13.01)与前台服务机制(13.02)
  4. 组件间靠 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。