Android 10 (API na poziomie 29) i nowsze wersje wprowadzają ograniczenia dotyczące tego, kiedy aplikacje mogą rozpoczynać działania, gdy działają w tle. Te ograniczenia pomagają zminimalizować przerwy w pracy użytkownika i zapewniają mu większą kontrolę nad tym, co jest wyświetlane na ekranie.
W tym przewodniku powiadomienia są przedstawione jako alternatywa dla uruchamiania działań w tle. Wymienia też konkretne przypadki, w których ograniczenie nie ma zastosowania.
Wyświetlaj powiadomienia
W prawie wszystkich przypadkach aplikacje działające w tle muszą wyświetlać powiadomienia wymagające natychmiastowej reakcji, aby przekazywać użytkownikowi pilne informacje, zamiast bezpośrednio rozpoczynać aktywność. Takie powiadomienia obejmują odbieranie połączeń przychodzących lub aktywnych alarmów.
System alertów i przypomnień oparty na powiadomieniach ma dla użytkowników kilka zalet:
- Gdy użytkownik korzysta z urządzenia, widzi powiadomienie, które umożliwia mu odpowiedź. Użytkownik zachowuje bieżący kontekst i ma kontrolę nad treściami wyświetlanymi na ekranie.
- Powiadomienia wymagające natychmiastowej reakcji są zgodne z zasadami 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 sprawdzić, które aplikacje ostatnio wysyłały powiadomienia, w tym z określonych kanałów powiadomień. Na tym ekranie użytkownik może kontrolować ustawienia powiadomień.
Kiedy aplikacje mogą rozpoczynać aktywności
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 stosie wstecznym istniejącego zadania na ekranie ostatnich aplikacji.
Aplikacja ma działanie, które rozpoczęło się niedawno.
Aplikacja o nazwie
finish()
niedawno wykonała działanie. Ma to zastosowanie tylko wtedy, gdy w momencie wywołania funkcjifinish()
aplikacja miała aktywność na pierwszym planie lub aktywność 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.
AccessibilityService
AutofillService
CallRedirectionService
HostApduService
InCallService
TileService
(Nie dotyczy Androida 14 (API na poziomie 34) i nowszych wersji)VoiceInteractionService
VrListenerService
.
Aplikacja ma usługę powiązaną z inną, widoczną aplikacją. Aplikacja powiązana z usługą musi pozostać widoczna, aby aplikacja w tle mogła prawidłowo rozpocząć działania.
Aplikacja otrzymuje powiadomienie
PendingIntent
z systemu. W przypadku oczekujących intencji dotyczących usług i odbiorników transmisji aplikacja może uruchamiać działania przez kilka sekund po wysłaniu oczekującej intencji.Aplikacja otrzymuje
PendingIntent
wysłany z innej, widocznej aplikacji.Aplikacja otrzymuje transmisję systemową, w wyniku której powinna uruchomić interfejs. Przykłady:
ACTION_NEW_OUTGOING_CALL
iSECRET_CODE_ACTION
. Aplikacja może rozpocząć działania kilka sekund po wysłaniu transmisji.Aplikacja jest powiązana z urządzeniem towarzyszącym za pomocą interfejsu
CompanionDeviceManager
. Ten interfejs API umożliwia aplikacji uruchamianie aktywności w odpowiedzi na działania, które użytkownik wykonuje na sparowanym urządzeniu.Aplikacja jest kontrolerem zasad 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 dedykowane, takie jak wyświetlacze cyfrowe i kioski.
Użytkownik przyznaje aplikacji uprawnienie
SYSTEM_ALERT_WINDOW
.
Wymagana zgoda użytkownika na rozpoczęcie działań z intencji PendingIntent
Aby uniknąć przypadkowego uruchamiania aktywności na podstawie wymienionych warunków, od Androida 14 dostępne są specjalne interfejsy API, które umożliwiają włączenie lub wyłączenie przyznawania aplikacji uprawnień do uruchamiania aktywności.
Aplikacje kierowane na Androida 15 lub nowszego domyślnie nie będą już niejawnie przyznawać uprawnień do uruchamiania aktywności w tle (BAL) tworzonym przez siebie PendingIntents
. Wymagane jest wyraźne zezwolenie użytkownika. W tym celu możesz skorzystać z tych opcji, w zależności od tego, czy aplikacja wysyła czy tworzy PendingIntents
.
Przez nadawcę intencji PendingIntent
Aplikacje kierowane na Androida 14 lub nowszego, które chcą uruchomić PendingIntent
, muszą
- spełniać wymienione warunki i
- wyrazić zgodę na uruchamianie aktywności w tle na podstawie tych wyjątków.
Zgoda użytkownika powinna być wymagana tylko wtedy, gdy deweloper aplikacji wie, że aplikacja ma rozpocząć aktywność.
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ę oczekującej intencji
Aplikacje kierowane na Androida 15 lub nowszą wersję, które tworzą PendingIntent
, muszą teraz wyraźnie wyrazić zgodę na uruchamianie aktywności w tle, jeśli chcą, aby te PendingIntents
można było uruchamiać w wymienionych warunkach.
W większości przypadków aplikacja, która rozpoczyna PendingIntent
, powinna wyrazić zgodę na udział w programie.
Jeśli jednak aplikacja tworząca musi przyznać te uprawnienia:
PendingIntent
można rozpocząć w dowolnym momencie, gdy aplikacja do tworzenia 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 podobnymi metodami.
Więcej informacji znajdziesz w odpowiedniej dokumentacji:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
Tryb ścisły
Od Androida 16 deweloper aplikacji może włączyć tryb ścisły, aby otrzymywać powiadomienia, gdy uruchomienie aktywności jest zablokowane (lub istnieje ryzyko zablokowania, gdy docelowy pakiet SDK aplikacji zostanie podniesiony).
Przykładowy kod, który należy włączyć na początku aplikacji, aktywności lub innego komponentu aplikacji w metodzie Application.onCreate()
:
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.