Sobes.tech
Middle

Pověz o přijímačích a poskytovatelích obsahu v Androidu.

sobes.tech AI

Odpověď od AI

Přijímače (Broadcast Receivers) reagují na systémové vysílané zprávy, například upozornění na nízkou úroveň baterie, připojení k síti nebo fotografování. Nemají vizuální rozhraní a vykonávají úkoly na pozadí.

Existují dva hlavní typy:

  • Staticky registrované: Jsou deklarovány v AndroidManifest.xml. Systém spustí aplikaci při přijetí odpovídajícího intentu, i když není spuštěná.
  • Dynamicky registrované: Jsou registrovány v kódu pomocí Context.registerReceiver(). Fungují pouze dokud existuje komponenta (například aktivita).

Každý přijímač implementuje metodu onReceive(Context context, Intent intent), kde se zpracovává příchozí intent.

Content poskytovatelé (Content Providers) spravují sdílený přístup ke strukturovaným datům. Poskytují standardní rozhraní CRUD (Create, Read, Update, Delete) pro interakci s daty uloženými v různých zdrojích (SQLite databáze, soubory, síťová data atd.).

Hlavní metody content poskytovatele:

  • onCreate(): Inicializace poskytovatele.
  • query(): Získání dat ze zdroje.
  • insert(): Přidání nových dat.
  • update(): Aktualizace stávajících dat.
  • delete(): Odstranění dat.
  • getType(): Vrací MIME typ dat podle daného URI.

Přístup k content poskytovateli je zajištěn přes ContentResolver. URI (Unified Resource Identifier) slouží k identifikaci konkrétní sady dat.

Příklad použití ContentResolver pro dotazování dat:

// Uri pro tabulku kontaktů
Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;

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

// Dotaz na data
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));
        // Zpracování dat
    }
    cursor.close();
}

Příklad registrace statického přijímače v 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>

Příklad implementace přijímače:

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
            // Akce při nízké úrovni baterie
        }
    }
}

Klíčové rozdíly:

Charakteristika Broadcast Receivers Content Providers
Účel Reakce na broadcast události Správa přístupu k datům
Rozhraní onReceive() CRUD metody přes ContentResolver
Vizuální zobrazení Neexistuje Neexistuje
Přístup Přijímají intenty ze systému Poskytují data na požádání