Activity
最重要的组件,生命周期见(Android开发学习:Activity和Fragment的生命周期Activity生命周期 官方文档生命周期图: on - 掘金)
Service
Service是专门用来在后台执行长时间操作的操作,没有独立界面,由于默认运行在主线程,所以不能直接执行耗时高的操作,否则会ANR
生命周期
如下是三个核心方法:
onCreate() → onStartCommand() → onDestroy()
如果是绑定调用,就不太一样:
onCreate() → onBind() → onUnbind() → onDestroy()
两种启动方式
- startService:独立运行,不会自动停止,要在最后自己手动停止
- bindService:与Activity或Fragment等调用组件绑定,解绑的时候销毁
两种方式是可以同时存在的
BroadcastReceiver
核心作用
- 系统事件响应:监听电量变化、开机完成、网络切换、拍照按钮等系统广播。
- 组件间通信:让不同 App 或同一 App 内不同组件(Activity、Service)相互传递消息。
- 触发后台任务:收到广播后启动 Service 或执行特定逻辑(如收到网络变化广播后同步数据)。
两种主要类型
| 类型 | 说明 | 生命周期 |
|---|---|---|
| 普通广播(Normal) | 异步发送,所有接收者几乎同时收到,无序 | 一次性 |
| 有序广播(Ordered) | 按优先级依次传递,可拦截或修改数据 | 逐个处理 |
两种注册方式
- 静态注册:在AndroidManifest.xml中注册,在App未启动时也可以接受广播(例如开机广播)
- 动态注册:在代码中,通过
Context.registerReceiver()注册,跟随组件生命周期,在Activity销毁的时候要取消注册
ContentProvider
核心作用是用来跨应用共享数据,实现数据的增删改查,可以封装数据、权限控制、统一接口,保证数据的安全,query()、insert()、update()、delete() 都运行在主线程,耗时操作要开子线程
示例代码:
// 读取系统联系人
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String name = cursor.getString(0);
String number = cursor.getString(1);
Log.d("Contact", name + ":" + number);
}
cursor.close();
}