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 |