Sobes.tech
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: Intent nie 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 tego Intent.
  • Unikalność: Różne PendingIntent są 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): uruchamia Activity.
  • 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ę z Service.
  • getForegroundService(Context context, int requestCode, Intent intent, int flags): uruchamia Foreground 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: PendingIntent może być używany tylko raz.
  • FLAG_NO_CREATE: Jeśli PendingIntent nie istnieje, nie jest tworzony, zwraca null.
  • FLAG_CANCEL_CURRENT: Jeśli już istnieje PendingIntent z tymi samymi parametrami, jest anulowany i tworzony nowy.
  • FLAG_UPDATE_CURRENT: Jeśli już istnieje PendingIntent z 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 niezmienny PendingIntent.
  • FLAG_MUTABLE: Tworzy zmienny PendingIntent (używać ostrożnie, może być podatny na ataki).

Wybór odpowiedniego flagi jest kluczowy dla poprawnego działania i bezpieczeństwa.