Sobes.tech
Middle

Opowiedz o odbiornikach i dostawcach treści w Androidzie.

sobes.tech AI

Odpowiedź od AI

Odbiorniki (Broadcast Receivers) reagują na komunikaty rozgłoszeniowe systemu, takie jak powiadomienia o niskim poziomie baterii, połączeniu sieci lub robieniu zdjęć. Nie mają interfejsu wizualnego i wykonują zadania w tle.

Istnieją dwa główne typy:

  • Statycznie zarejestrowane: Deklarowane w AndroidManifest.xml. System uruchamia aplikację po otrzymaniu odpowiedniego intentu, nawet jeśli nie jest uruchomiona.
  • Dynamically registered: Rejestrowane w kodzie za pomocą Context.registerReceiver(). Działają tylko podczas istnienia komponentu (np. aktywności).

Każdy odbiornik implementuje metodę onReceive(Context context, Intent intent), w której przetwarzany jest nadchodzący intent.

Dostawcy treści (Content Providers) zarządzają wspólnym dostępem do danych ustrukturyzowanych. Zapewniają standaryzowany interfejs CRUD (Create, Read, Update, Delete) do interakcji z danymi przechowywanymi w różnych źródłach (bazy SQLite, pliki, dane sieciowe itp.).

Główne metody dostawcy treści:

  • onCreate(): Inicjalizacja dostawcy.
  • query(): Pobieranie danych ze źródła.
  • insert(): Dodawanie nowych danych.
  • update(): Aktualizacja istniejących danych.
  • delete(): Usuwanie danych.
  • getType(): Zwraca typ MIME danych dla danego URI.

Dostęp do dostawcy treści odbywa się przez ContentResolver. URI (Zunifikowany identyfikator zasobu) służy do identyfikacji konkretnego zestawu danych.

Przykład użycia ContentResolver do zapytania danych:

// Uri dla tabeli kontaktów
Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;

String[] projection = {
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME
};

// Zapytanie danych
Cursor cursor = getContentResolver().query(
    contactsUri,
    projection,
    null, // wybór
    null, // argumenty wyboru
    null  // sortowanie
);

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));
        // Przetwarzanie danych
    }
    cursor.close();
}

Przykład rejestracji statycznego odbiornika w 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>

Przykład implementacji odbiornika:

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
            // Działania przy niskim poziomie baterii
        }
    }
}

Kluczowe różnice:

Cecha Broadcast Receivers Content Providers
Cel Reakcja na zdarzenia rozgłoszeniowe Zarządzanie dostępem do danych
Interfejs onReceive() Metody CRUD przez ContentResolver
Wizualizacja Brak Brak
Dostęp Odbierają intenty z systemu Udostępniają dane na żądanie