四大组件:Activity、Service、BroadcastReceiver、ContentProvider
Android 四大核心组件,是 App 与系统交互的入口,全部需要在 AndroidManifest.xml 清单文件中声明。
一、Activity(活动)
负责页面、UI 交互,用户看得见的界面
-
作用:展示视图、接收用户操作事件,一个页面 ≈ 一个 Activity
-
生命周期(7 个回调)
onCreate():创建初始化,只执行一次onStart():可见,但不可交互onResume():可见 + 可交互,前台运行onPause():失去焦点,部分遮挡onStop():完全不可见onRestart():从停止重新启动onDestroy():销毁回收资源
-
启动方式
- 显式 Intent:指定目标类,应用内部跳转
- 隐式 Intent:Action/Data,跨应用跳转
-
任务栈:采用后进先出,管理多个 Activity
二、Service(服务)
后台执行任务, 无 UI 界面 ,不需要和用户交互 注意:Service不会新开线程,默认运行在主线程(UI 线程)!耗时任务必须手动开子线程
两种启动模式
-
startService()
- 启动后独立运行,就算启动它的页面关闭,Service 仍然存活
- 停止:
stopService()/stopSelf() - 生命周期:
onCreate→onStartCommand→onDestroy
-
bindService () 绑定服务
- 客户端‑服务端通信,可拿到 Service 的 Binder 对象,调用服务内部方法
- 宿主解绑 (unbind) 后,Service 随之销毁
- 生命周期:
onCreate→onBind→onUnbind→onDestroy
前台服务:显示通知栏,优先级高不容易被系统杀死(例:音乐播放)
三、BroadcastReceiver(广播接收器)
系统 / 应用发出广播,组件接收消息,做解耦通信
- 两种注册方式
1)静态注册(清单注册)
AndroidManifest.xml 声明 receiver,App 未启动也可以收到广播
Android8.0 以后大量隐式静态广播被限制,只能接收少数系统广播
2)动态注册(代码注册)
registerReceiver(),Activity 运行时注册;页面销毁时必须 unregisterReceiver (),防止内存泄漏。只能 App 运行时接收。 2. 广播分类
- 普通广播:异步发送,无序,
sendBroadcast() - 有序广播:按优先级接收,可截断
sendOrderedBroadcast() - 粘性广播:Android5.0 废弃
典型场景:监听开机、电量变化、网络切换、推送消息
四、ContentProvider(内容提供者)
跨进程、跨应用共享数据,安卓标准的数据访问接口
- 作用:对外暴露自己的数据,让别的 App 读写;封装数据(SQLite 等),提供统一访问入口
- 通过 Uri 定位数据
content://authority/路径/id
- 配套工具:
ContentResolver,外部程序用来访问 ContentProvider - 核心方法
query() // 查询
insert() // 插入
update() // 更新
delete() // 删除
getType() // 返回MIME类型
例子:读取系统通讯录、相册
四大组件对比速查表
表格
| 组件 | 核心用途 | 有无 UI | 运行线程 |
|---|---|---|---|
| Activity | 用户界面交互 | ✅有 UI | 主线程 |
| Service | 后台长时间任务 | ❌无 UI | 主线程 |
| BroadcastReceiver | 接收广播消息通知 | ❌无 UI | 主线程 |
| ContentProvider | 跨程序共享数据 | ❌无 UI | Binder 线程池 |
面试高频考点
- 四大组件都必须在清单注册,除了动态注册的广播
- Service 不是子线程,耗时操作需自己开 Thread / Coroutine / WorkManager
- Activity 销毁前,动态广播一定要解注册,否则内存泄漏
- ContentProvider 是跨进程通信 IPC 方案之一
如果你需要,我可以给你一份Kotlin 完整 Demo 代码示例,或者四大组件面试题合集。