Android 的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)是应用开发的核心模块,它们各自拥有独特的生命周期和工作原理。以下是详细说明:
一、Activity
用途:用户界面交互的核心组件,负责展示 UI 并处理用户操作。
生命周期方法:
onCreate()
调用时机:Activity 首次创建时调用。
作用:初始化 UI(setContentView)、绑定数据、恢复保存状态(savedInstanceState)。
注意:必须调用,否则会崩溃。
onStart()
调用时机:Activity 可见但未进入前台(不可交互)。
作用:初始化资源(如数据库连接),注册监听器。
onResume()
调用时机:Activity 进入前台,可交互。
作用:启动动画、传感器监听等需要实时响应的操作。
onPause()
调用时机:Activity 失去焦点(如弹出对话框或跳转到其他 Activity)。
作用:释放资源(如相机)、保存临时数据。
注意:不能执行耗时操作,否则会影响新 Activity 的启动。
onStop()
调用时机:Activity 完全不可见(被其他 Activity 覆盖或应用退到后台)。
作用:释放 UI 相关资源,注销监听器。
onRestart()
调用时机:Activity 从 Stopped 状态重新回到前台前调用。
作用:恢复 onStop() 中释放的资源。
onDestroy()
调用时机:Activity 被销毁前(用户主动退出或系统回收资源)。
作用:释放所有资源,避免内存泄漏。
核心场景:
配置变更(如旋转屏幕):默认会销毁并重建 Activity,可通过 onSaveInstanceState() 保存临时数据。
后台被回收:系统可能杀死后台 Activity,需通过 savedInstanceState 恢复关键数据。
二、Service
用途:在后台执行长时间运行的操作,无界面。
生命周期:
启动服务(通过 startService())
onCreate() → onStartCommand() → onDestroy()
特点:服务与启动它的组件解耦,即使组件销毁,服务仍可运行。
绑定服务(通过 bindService())
onCreate() → onBind() → onUnbind() → onDestroy()
特点:通过 IBinder 接口与组件通信,绑定组件全部解绑后服务销毁。
关键方法:
onStartCommand(intent, flags, startId)
返回 START_STICKY(系统杀死服务后自动重启)或 START_NOT_STICKY。
stopSelf() / stopService():主动停止服务。
注意事项:
ANR 风险:主线程中执行耗时操作会导致 ANR,需使用工作线程。
前台服务:Android 8.0+ 需调用 startForeground() 显示通知,避免被系统杀死。
三、BroadcastReceiver
用途:接收系统或应用发送的广播(如网络状态变化、电量低)。
注册方式:
静态注册(Manifest 中声明)
应用未启动时也能接收广播(如开机完成事件)。
Android 7.0+ 限制部分隐式广播(需使用动态注册)。
动态注册(代码中 registerReceiver())
需在 onDestroy() 中调用 unregisterReceiver() 防止内存泄漏。
生命周期:
onReceive(Context, Intent):
主线程执行,需避免耗时操作(超过 10 秒会 ANR)。
可启动 Service 或 JobIntentService 处理后台任务。
有序广播 vs 普通广播:
有序广播:通过 sendOrderedBroadcast() 发送,按优先级顺序传递,可被拦截。
普通广播:通过 sendBroadcast() 发送,异步传递,无法拦截。
四、ContentProvider
用途:跨应用数据共享(如通讯录、数据库)。
生命周期:
onCreate()
在 Application 的 onCreate() 之前调用,初始化数据库等资源。
核心方法:
CRUD 操作:query(), insert(), update(), delete()。
getType():返回 MIME 类型。
数据访问:
通过 ContentResolver 操作 URI(如 content://com.example.provider/table)。
权限控制:通过 AndroidManifest.xml 声明读写权限。
多线程安全:
需自行处理线程同步(如使用 SQLite 的线程安全模式)。
总结对比表
组件 | 启动方式 | 生命周期特点 | 主要用途 |
---|---|---|---|
Activity | Intent 显式/隐式跳转 | 受用户交互和系统回收影响 | 用户界面交互 |
Service | startService() / bindService() | 后台运行,依赖启动方式 | 长时间后台任务 |
BroadcastReceiver | 静态注册 / 动态注册 | 短暂存活,onReceive 执行完即结束 | 响应系统或应用事件 |
ContentProvider | 通过 ContentResolver | 由系统管理,单例模式 | 跨应用数据共享 |
常见问题
Activity 的 onPause() 和 onStop() 区别
onPause():失去焦点但仍可见(如对话框覆盖)。
onStop():完全不可见。
Service 的 ANR 如何避免
使用 IntentService(已废弃)或 JobIntentService,或结合 WorkManager。
静态广播的限制
Android 8.0+ 禁止大部分隐式广播的静态注册(除白名单如 BOOT_COMPLETED)。
ContentProvider 的性能优化
使用批量操作(applyBatch()),避免频繁数据库开关。
通过理解四大组件的生命周期和原理,可以更高效地管理应用资源并提升用户体验。