Ograniczenia dotyczące rozpoczynania działań w tle

Android 10 (poziom 29 interfejsu API) i nowsze wersje wprowadzają ograniczenia dotyczące tego, kiedy aplikacje mogą rozpoczynać działania gdy działają w tle. Te ograniczenia pomagają zminimalizować zakłócenia dla użytkownika i zapewniają mu większą kontrolę nad tym, co jest wyświetlane na ekranie.

Ten przewodnik przedstawia powiadomienia jako alternatywę dla rozpoczynania działań w tle. Zawiera też listę konkretnych przypadków, w których ograniczenie nie obowiązuje.

Zamiast tego wyświetlaj powiadomienia

W prawie wszystkich przypadkach aplikacje działające w tle muszą wyświetlać powiadomienia o czasie, aby przekazywać użytkownikowi pilne informacje, zamiast bezpośrednio rozpoczynać działanie. Takie powiadomienia obejmują obsługę połączenia przychodzącego lub aktywnego alarmu.

Ten system alertów i przypomnień oparty na powiadomieniach zapewnia użytkownikom kilka korzyści:

  • Gdy użytkownik korzysta z urządzenia, widzi powiadomienie z ostrzeżeniem, na które może odpowiedzieć. Użytkownik zachowuje bieżący kontekst i ma kontrolę nad treściami wyświetlanymi na ekranie.
  • Powiadomienia o czasie są zgodne z regułami trybu Nie przeszkadzać użytkownika . Na przykład użytkownicy mogą zezwolić na połączenia tylko od określonych kontaktów lub od osób, które dzwonią wielokrotnie, gdy włączony jest tryb Nie przeszkadzać.
  • Gdy ekran urządzenia jest wyłączony, intencja pełnoekranowa uruchamia się natychmiast.
  • Na ekranie Ustawienia urządzenia użytkownik może zobaczyć, które aplikacje wysłały ostatnio powiadomienia, w tym z określonych kanałów powiadomień. Na tym ekranie użytkownik może kontrolować swoje preferencje dotyczące powiadomień.

Kiedy aplikacje mogą rozpoczynać działania

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

  • Aplikacja ma widoczne okno, np. działanie na pierwszym planie.

  • Aplikacja ma działanie w stosie wstecznym zadania na pierwszym planie.

  • Aplikacja ma działanie w stosie wstecznym istniejącego zadania na ekranie Ostatnie.

  • Aplikacja ma działanie, które zostało rozpoczęte bardzo niedawno.

  • Aplikacja bardzo niedawno wywołała funkcję finish() w działaniu. Dotyczy to tylko sytuacji, gdy w momencie wywołania funkcji finish() aplikacja miała działanie na pierwszym planie lub działanie w stosie wstecznym zadania na pierwszym planie.

  • Aplikacja ma jedną z tych usług, która jest powiązana z systemem. Te usługi mogą wymagać uruchomienia interfejsu.

  • Aplikacja ma usługę, która jest powiązana z inną, widoczną aplikacją. Aplikacja powiązana z usługą musi pozostać widoczna, aby aplikacja w tle mogła pomyślnie rozpocząć działania.

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

  • Aplikacja otrzymuje PendingIntent wysłaną z innej, widocznej aplikacji.

  • Aplikacja otrzymuje komunikat systemowy, w którym ma uruchomić interfejs. Przykłady to ACTION_NEW_OUTGOING_CALL i SECRET_CODE_ACTION. Aplikacja może rozpoczynać działania przez kilka sekund po wysłaniu transmisji.

  • Aplikacja jest powiązana z towarzyszącym urządzeniem sprzętowym za pomocą interfejsu CompanionDeviceManager API. Ten interfejs API umożliwia aplikacji rozpoczynanie działań w odpowiedzi na działania, które użytkownik wykonuje na sparowanym urządzeniu.

  • Aplikacja jest kontrolerem zasad dotyczących urządzeń działającym w trybie właściciela urządzenia. Przykłady zastosowań to w pełni zarządzane urządzenia firmowe oraz urządzenia specjalne, takie jak wyświetlacze cyfrowe i kioski.

  • Użytkownik przyznał aplikacji uprawnienie SYSTEM_ALERT_WINDOW.

Wymagana zgoda na rozpoczynanie działań z poziomu PendingIntents

Aby uniknąć przypadkowego rozpoczynania Activity na podstawie wymienionych warunków, od Androida 14 dostępne są wyraźne interfejsy API, które umożliwiają wyrażenie zgody na przyznanie aplikacji uprawnień aplikacji do rozpoczynania Activity lub wycofanie tej zgody.

Aplikacje kierowane na Androida 15 lub nowszego domyślnie nie będą już niejawnie przyznawać uprawnień do uruchamiania działań w tle (BAL) tworzonym przez siebie PendingIntents. Wymagana jest wyraźna zgoda. Aby ją wyrazić, musisz wybrać jedną z tych opcji w zależności od tego, czy aplikacja wysyła, czy tworzy PendingIntents.

Tabela intencji oczekujących
Rysunek 1. Proces decyzyjny dotyczący uruchamiania działań w tle.

Przez nadawcę PendingIntent

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

  • spełniać wymienione warunki oraz
  • wyrazić zgodę na uruchamianie działań w tle na podstawie tych wyjątków.

Zgoda powinna być wyrażana tylko wtedy, gdy deweloper aplikacji wie, że aplikacja rozpocznie działanie.

Aby wyrazić zgodę, aplikacja powinna przekazać pakiet ActivityOptions z setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) do PendingIntent.send() lub podobnych metod.

Przez twórcę PendingIntent

Aplikacje kierowane na Androida 15 lub nowszego, które tworzą PendingIntent, muszą teraz wyraźnie wyrazić zgodę na uruchamianie działań w tle, jeśli chcą, aby te PendingIntents można było uruchamiać w wymienionych warunkach.

W większości przypadków to aplikacja rozpoczynająca PendingIntent powinna wyrazić zgodę. Jeśli jednak aplikacja tworząca musi przyznać te uprawnienia:

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

Aby wyrazić zgodę, aplikacja powinna przekazać pakiet ActivityOptions z setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) do PendingIntent.getActivity() lub podobnych metod.

Więcej informacji znajdziesz w odpowiedniej dokumentacji:

Tryb ścisły

Od Androida 16 deweloper aplikacji może włączyć tryb ścisły, aby otrzymywać powiadomienia, gdy uruchomienie działania jest zablokowane (lub gdy istnieje ryzyko zablokowania, gdy zwiększy się docelowy pakiet SDK aplikacji).

Przykładowy kod, który można włączyć na wczesnym etapie w metodzie Application.onCreate() aplikacji, działania lub innego komponentu aplikacji:

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }

Więcej informacji znajdziesz w dokumentacji trybu ścisłego.