Расскажи о ресиверах и контент-провайдерах в Android.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Ресиверы (Broadcast Receivers) реагируют на общесистемные широковещательные сообщения, например, уведомления о низком заряде батареи, подключении сети или фотографировании. Они не имеют визуального интерфейса и выполняют фоновые задачи.
Существует два основных типа:
- Зарегистрированные статически: Объявляются в
AndroidManifest.xml. Система запускает приложение при получении соответствующего интента, даже если оно не запущено. - Зарегистрированные динамически: Регистрируются в коде с помощью
Context.registerReceiver(). Работают только пока компонент (например, активность) существует.
Каждый ресивер реализует метод onReceive(Context context, Intent intent), где обрабатывается входящий интент.
Контент-провайдеры (Content Providers) управляют общим доступом к структурированным данным. Они предоставляют стандартизированный интерфейс CRUD (Create, Read, Update, Delete) для взаимодействия с данными, хранящимися в различных источниках (SQLite-базы данных, файлы, сетевые данные и т.д.).
Основные методы контент-провайдера:
onCreate(): Инициализация провайдера.query(): Получение данных из источника.insert(): Добавление новых данных.update(): Обновление существующих данных.delete(): Удаление данных.getType(): Возвращает MIME-тип данных по данномуURI.
Доступ к контент-провайдеру осуществляется через ContentResolver. URI (Unified Resource Identifier) используется для идентификации конкретного набора данных.
Пример использования ContentResolver для запроса данных:
// Uri для таблицы контактов
Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
};
// Запрос данных
Cursor cursor = getContentResolver().query(
contactsUri,
projection,
null, // selection
null, // selectionArgs
null // sortOrder
);
if (cursor != null) {
while (cursor.moveToNext()) {
long contactId = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String displayName = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
// Обработка данных
}
cursor.close();
}
Пример регистрации статического ресивера в AndroidManifest.xml:
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BATTERY_LOW" />
</intent-filter>
</receiver>
Пример реализации ресивера:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
// Выполнение действий при низком заряде батареи
}
}
}
Ключевые отличия:
| Характеристика | Ресиверы (Broadcast Receivers) | Контент-провайдеры (Content Providers) |
|---|---|---|
| Назначение | Реакция на широковещательные события | Управление доступом к данным |
| Интерфейс | onReceive() |
CRUD методы через ContentResolver |
| Визуальное отображение | Отсутствует | Отсутствует |
| Доступ | Получают интенты из системы | Предоставляют данные по запросу |