Middle
Czym jest PendingIntent?
sobes.tech AI
Odpowiedź od AI
To jest opakowanie wokół Intent, które deleguje uprawnienia innemu aplikacji do wykonania tego Intent w naszym imieniu w przyszłości.
Kluczowe cechy:
- Opóźnione wykonanie:
Intentnie jest wykonywany od razu, lecz później przez inny komponent. - Uprawnienia: Komponent, któremu przekazywany jest
PendingIntent, uzyskuje te same uprawnienia co nasza aplikacja do wykonania tegoIntent. - Unikalność: Różne
PendingIntentsą uważane za takie same, jeśli mają ten sam typ komponentu, akcję (action), dane (data), kategorie (categories) i flagi (flags). - Użycie: Często stosowane do powiadomień, zadań w tle, widgetów i AlarmManager.
Typy PendingIntent odpowiadają typom docelowych komponentów:
getActivity(Context context, int requestCode, Intent intent, int flags): uruchamiaActivity.getBroadcast(Context context, int requestCode, Intent intent, int flags): wysyła broadcast.getService(Context context, int requestCode, Intent intent, int flags): uruchamia lub łączy się zService.getForegroundService(Context context, int requestCode, Intent intent, int flags): uruchamiaForeground Service.
// Przykład tworzenia PendingIntent dla powiadomień
Intent notificationIntent = new Intent(context, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
context,
0, // requestCode, używany do rozróżnienia PendingIntent
notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE // Flagi do zarządzania zachowaniem
);
// Teraz ten pendingIntent można przekazać, na przykład, do powiadomienia
Flagi (flags) wpływają na zachowanie podczas tworzenia lub aktualizacji istniejącego PendingIntent:
FLAG_ONE_SHOT:PendingIntentmoże być używany tylko raz.FLAG_NO_CREATE: JeśliPendingIntentnie istnieje, nie jest tworzony, zwracanull.FLAG_CANCEL_CURRENT: Jeśli już istniejePendingIntentz tymi samymi parametrami, jest anulowany i tworzony nowy.FLAG_UPDATE_CURRENT: Jeśli już istniejePendingIntentz tymi samymi parametrami, jego dodatkowe dane (dane extra) są aktualizowane.FLAG_IMMUTABLE(obowiązkowe od S/API 31 w większości przypadków): Tworzy niezmiennyPendingIntent.FLAG_MUTABLE: Tworzy zmiennyPendingIntent(używać ostrożnie, może być podatny na ataki).
Wybór odpowiedniego flagi jest kluczowy dla poprawnego działania i bezpieczeństwa.