Sobes.tech
Middle

Разкажете за приемниците и доставчиците на съдържание в Android.

sobes.tech AI

Отговор от AI

Ресивърите (Broadcast Receivers) реагират на системни широковещателни съобщения, като например уведомления за ниска батерия, свързване към мрежа или заснемане на снимка. Те нямат визуален интерфейс и изпълняват фонови задачи.

Има два основни типа:

  • Статично регистрирани: Обявяват се в AndroidManifest.xml. Системата стартира приложението при получаване на съответния intent, дори ако то не е стартирано.
  • Динамично регистрирани: Регистрират се в кода чрез Context.registerReceiver(). Работят само докато компонентът (например активност) съществува.

Всеки ресивър реализира метода onReceive(Context context, Intent intent), където се обработва входящият intent.

Content доставчиците (Content Providers) управляват споделения достъп до структурирани данни. Те предоставят стандартизиран интерфейс CRUD (Create, Read, Update, Delete) за взаимодействие с данните, съхранявани в различни източници (SQLite бази данни, файлове, мрежови данни и т.н.).

Основните методи на content доставчика:

  • onCreate(): Инициализация на доставчика.
  • query(): Получаване на данни.
  • insert(): Добавяне на нови данни.
  • update(): Актуализиране на съществуващи данни.
  • delete(): Изтриване на данни.
  • getType(): Връща MIME тип на данните по даден URI.

Достъпът до content доставчика се осъществява чрез 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
Визуално представяне Не съществува Не съществува
Достъп Получават intents от системата Предоставят данни по заявка