Android开发学习:Android四大组件

1 阅读2分钟

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)按优先级依次传递,可拦截或修改数据逐个处理

两种注册方式

  1. 静态注册:在AndroidManifest.xml中注册,在App未启动时也可以接受广播(例如开机广播)
  2. 动态注册:在代码中,通过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();
}