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 funkcjifinish()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.
AccessibilityServiceAutofillServiceCallRedirectionServiceHostApduServiceInCallServiceTileService(nie dotyczy Androida 14 (poziom 34 interfejsu API) i nowszych wersji)VoiceInteractionServiceVrListenerService.
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
PendingIntentwysłaną z innej, widocznej aplikacji.Aplikacja otrzymuje komunikat systemowy, w którym ma uruchomić interfejs. Przykłady to
ACTION_NEW_OUTGOING_CALLiSECRET_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
CompanionDeviceManagerAPI. 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.
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:
PendingIntentmożna rozpocząć w dowolnym momencie, gdy aplikacja tworząca jest widoczna.PendingIntentmoż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:
ActivityOptions.setPendingIntentBackgroundActivityStartModeActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
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.