Ograniczenia dotyczące rozpoczynania działań w tle

Android 10 (poziom interfejsu API 29) i wyższe ograniczenia miejsc dotyczące tego, kiedy aplikacje mogą rozpoczynać aktywność, gdy działają w tle. Te ograniczenia pomagają zminimalizować przerwy w wyświetlaniu treści i zapewnić użytkownikowi większą kontrolę nad tym, co wyświetla się na ekranie.

Ten przewodnik przedstawia powiadomienia jako alternatywę dla rozpoczynania działań w tle. Wskazuje też konkretne przypadki, w których dane ograniczenie nie ma zastosowania.

Zamiast tego wyświetlaj powiadomienia

W niemal wszystkich przypadkach aplikacje działające w tle muszą wyświetlać pilne powiadomienia, aby przekazać użytkownikowi pilne informacje, zamiast rozpoczynać działanie. Obejmują one obsługę przychodzącego połączenia telefonicznego lub aktywnego budzika.

Ten oparty na powiadomieniach system alertów i przypomnień ma kilka zalet:

  • Podczas korzystania z urządzenia użytkownik widzi powiadomienie z ostrzeżeniem, dzięki któremu może na nie odpowiedzieć. Użytkownik zachowuje aktualny kontekst i ma kontrolę nad treściami, które widzi na ekranie.
  • Powiadomienia ograniczone czasowo podlegają regułom Nie przeszkadzać określonym przez użytkownika. Na przykład po włączeniu trybu Nie przeszkadzać użytkownicy mogą zezwolić na dzwonienie tylko od określonych kontaktów lub od dzwoniących powtórnie.
  • Gdy ekran urządzenia jest wyłączony, natychmiast uruchamia się intencja pełnoekranowa.
  • Na ekranie Ustawienia urządzenia użytkownik może sprawdzić, które aplikacje wysyłały ostatnio powiadomienia, w tym z określonych kanałów powiadomień. Na tym ekranie użytkownik może dostosować swoje ustawienia powiadomień.

Kiedy aplikacje mogą rozpoczynać aktywność

Aplikacje działające na Androidzie 10 lub nowszym mogą rozpoczynać działania, gdy spełniony jest co najmniej jeden z tych warunków:

  • Aplikacja ma widoczne okno, np. aktywność na pierwszym planie.
  • Aplikacja ma aktywność w stosie wstecznym zadania na pierwszym planie.
  • Aplikacja ma aktywność w wstecznym stosie istniejącego zadania na ekranie Ostatnie.

  • W aplikacji występuje aktywność, która rozpoczęła się niedawno.

  • Niedawno aplikacja o nazwie finish() nazwała aktywność. Dotyczy to tylko sytuacji, gdy w momencie wywołania funkcji finish() aplikacja miała aktywność na pierwszym planie lub działanie na tylnym stosie zadania na pierwszym planie.

  • Aplikacja ma jedną z tych usług powiązanych z systemem. Te usługi mogą wymagać uruchomienia interfejsu użytkownika.

  • Aplikacja ma usługę powiązaną z inną, widoczną aplikacją. Aplikacja powiązana z usługą musi być dla niej widoczna w tle, aby mogła rozpocząć działania.

  • Aplikacja otrzymuje powiadomienie PendingIntent z systemu. W przypadku oczekujących intencji dla usług i odbiorników aplikacja może rozpoczynać działania przez kilka sekund po wysłaniu oczekującej intencji.

  • Aplikacja odbiera sygnał PendingIntent wysyłany z innej, widocznej aplikacji.

  • Aplikacja odbiera komunikat systemowy, w którym ma się uruchomić interfejs użytkownika. Przykłady: ACTION_NEW_OUTGOING_CALL i SECRET_CODE_ACTION. Aplikacja może rozpoczynać aktywność przez kilka sekund po wysłaniu transmisji.

  • Aplikacja jest powiązana z urządzeniem towarzyszącym za pomocą interfejsu API CompanionDeviceManager. Umożliwia on aplikacji uruchamianie działań w odpowiedzi na działania wykonywane przez użytkownika na sparowanym urządzeniu.

  • Ta aplikacja jest kontrolerem zasad urządzeń działającym w trybie właściciela urządzenia. Przykładowe zastosowania obejmują w pełni zarządzane urządzenia firmowe, a także urządzenia specjalne, takie jak cyfrowe tablice informacyjne i kioski.

  • Użytkownik przyznał aplikacji uprawnienie SYSTEM_ALERT_WINDOW.

Wymagana akceptacja przy rozpoczynaniu działań od intencji PendingIntent

Aby uniknąć zezwalania na aktywność przypadkową, zgodnie z wymienionymi warunkami, od Androida 14 istnieją konkretne interfejsy API, które pozwalają na włączanie i wyłączanie uprawnień aplikacji do rozpoczynania aktywności.

Zobacz:

  • ActivityOptions.setPendingIntentBackgroundActivityStartMode
  • ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode

Przez nadawcę intencji PendingIntent

Aplikacje kierowane na Androida 14 lub nowszego, które chcą uruchamiać PendingIntent, muszą

  • spełniają podane warunki oraz
  • włącz uruchamianie aktywności w tle na podstawie tych wyjątków

Akceptacja powinna nastąpić tylko wtedy, gdy deweloper aplikacji wie, że rozpocznie w niej aktywność.

Aby to zrobić, aplikacja powinna przekazać pakiet ActivityOptions z atrybutem setPendingIntentBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) do metody PendingIntent.send(...) lub podobnej.

Autor intencji PendingIntent

Aplikacje kierowane na Androida 15 lub nowszego, które generują PendingIntent, muszą

  • spełniają podane warunki oraz
  • włącz uruchamianie aktywności w tle na podstawie tych wyjątków

W większości przypadków akceptacją powinna być aplikacja uruchamiająca PendingIntent.

Gdy aplikacja, która tworzy PendingIntent, wyrazi zgodę, dzieje się tak:

  • PendingIntent można uruchomić w dowolnym momencie, gdy widoczna jest aplikacja tworząca
  • PendingIntent można uruchomić w dowolnym momencie, jeśli aplikacja tworząca aplikację ma specjalne uprawnienia

Dlatego dobrze jest nie przekazywać tego kodu PendingIntent niezaufanej aplikacji i anulować żądanie PendingIntent, gdy nie jest on już używany.

Aby to zrobić, aplikacja powinna przekazać pakiet ActivityOptions z atrybutem setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) do metody PendingIntent.getActivity(...) lub podobnej.