Разкажете за приемниците и доставчиците на съдържание в 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 от системата | Предоставят данни по заявка |