Назад к вопросам
Middle
91
questionbank

Расскажи о ресиверах и контент-провайдерах в 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
Визуальное отображение Отсутствует Отсутствует
Доступ Получают интенты из системы Предоставляют данные по запросу