Questa pagina illustra alcuni motivi comuni per cui i servizi in primo piano possono non riuscire e ti aiuta a identificare la causa del problema.
Questo documento tratta i seguenti problemi:
Prima di procedere alla risoluzione dei problemi
Verifica le modifiche apportate di recente ai servizi in primo piano
Se i servizi in primo piano vengono utilizzati in modo improprio, possono avere effetti negativi sulle prestazioni del dispositivo e sulla durata della batteria. Per questo motivo, le release della piattaforma Android apportano spesso modifiche al comportamento dei servizi in primo piano per limitare questi effetti negativi.
Se hai problemi con i servizi in primo piano, consulta la documentazione relativa alle modifiche apportate ai servizi in primo piano e verifica se sono state apportate modifiche recenti che potrebbero spiegare i tuoi problemi. È particolarmente importante verificare la presenza di modifiche in queste circostanze:
- Il codice del servizio in primo piano che prima funzionava ora non funziona più
- Hai appena iniziato a eseguire test su una nuova release della piattaforma o hai modificato il livello API di destinazione della tua app
Inoltre, se stai testando il tuo dispositivo su un'anteprima per sviluppatori della piattaforma, assicurati di controllare la versione più recente della documentazione dell'anteprima per sviluppatori.
Errori ANR (L'applicazione non risponde)
In determinate circostanze, è previsto che un'app chiuda il servizio in primo piano. Se l'app non arresta il servizio, il sistema lo arresta e attiva un errore L'applicazione non risponde (ANR).
L'esecuzione breve del servizio è troppo lunga, causando un errore ANR
I servizi in primo piano che utilizzano il tipo di servizio breve
devono essere completati rapidamente, entro circa tre minuti. Quando il tempo scade, il
sistema chiama il metodo
Service.onTimeout(int,int) del servizio. Il servizio ha
alcuni secondi per chiamare stopSelf(). Se il servizio non si arresta, il sistema attiva un errore L'applicazione non risponde.
Diagnosi:
Se l'errore ANR è stato causato da un servizio in primo piano che non è riuscito ad arrestarsi, il sistema genera un'eccezione interna. Puoi verificare che si tratti di questo problema controllando i report ANR. In questo caso, il report includerà il seguente messaggio:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type FOREGROUND_SERVICE_TYPE_SHORT_SERVICE did not stop within its timeout:
[component name]"
Correggi:
Assicurati che tutti i servizi in primo piano con limite di tempo completino il loro lavoro e chiamino
stopForeground(int) entro il limite di tempo del sistema.
Fai in modo che i servizi in primo piano implementino Service.onTimeout(int,int).
Assicurati che l'implementazione di questo metodo chiami immediatamente stopSelf().
Eccezioni del servizio in primo piano
Questa sezione descrive diversi problemi relativi ai servizi in primo piano che possono causare la generazione di un'eccezione da parte del sistema. Se l'app non rileva l'eccezione, l'utente vede una finestra di dialogo che indica che l'app è stata arrestata.
In alcuni casi, il sistema genera un'eccezione interna. In questi casi, puoi scoprire qual è l'eccezione esaminando l'analisi dello stack e puoi controllare Logcat per informazioni più dettagliate sugli errori.
Eccezione interna: timeout superato
Il sistema impone un limite alla durata di esecuzione dei servizi in primo piano di sincronizzazione dei dati ed elaborazione dei contenuti multimediali
mentre l'app è in background. Se il servizio supera questo limite, il sistema chiama il metodo Service.onTimeout(int,int) del servizio. Il servizio ha alcuni secondi per chiamare stopSelf(). Se il servizio non si arresta, il sistema genera un'eccezione interna RemoteServiceException che causa l'arresto anomalo dell'app.
Diagnosi:
Puoi scoprire qual è l'eccezione esaminando lo stack trace e puoi controllare Logcat per informazioni più dettagliate sugli errori. In questo caso, Logcat contiene il seguente messaggio di errore:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
Correggi:
Assicurati che tutti i servizi in primo piano con limite di tempo completino il loro lavoro e chiamino stopForeground(int) entro il limite di tempo del sistema.
Fai in modo che i servizi in primo piano implementino Service.onTimeout(int,int).
Assicurati che l'implementazione di questo metodo chiami immediatamente stopSelf().
Eccezione interna: ForegroundServiceDidNotStartInTimeException
Quando avvii un servizio chiamando
context.startForegroundService(),
questo servizio ha alcuni secondi per promuoversi a servizio in primo piano
chiamando
ServiceCompat.startForeground().
In caso contrario, viene generata un'eccezione interna ForegroundServiceDidNotStartInTimeException.
Diagnosi:
Puoi scoprire qual è l'eccezione esaminando lo stack trace e puoi controllare Logcat per informazioni più dettagliate sugli errori. In questo caso, Logcat contiene il seguente messaggio di errore:
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()
Correggi:
Assicurati che tutti i servizi in primo piano appena creati chiamino ServiceCompat.startForeground() entro pochi secondi.
WorkManager:
Potresti visualizzare questa eccezione anche con i worker WorkManager che eseguono un
servizio in primo piano
(chiamano setForegound o setForegroundAsync). Quando il ciclo di vita di due
worker in primo piano si sovrappone, perché un worker tenta di avviare un servizio in primo piano
mentre un servizio in primo piano in esecuzione in precedenza tenta di arrestarsi, questo
arresto anomalo sarà accompagnato dal seguente log:
Re-initializing SystemForegroundService after a request to shut-down
Una correzione di questo arresto anomalo è stata introdotta in WorkManager versione 2.10.5.
Se la tua app riscontra questa eccezione, esegui l'aggiornamento alla versione più recente di WorkManager e segnala eventuali problemi persistenti al tracker dei problemi di WorkManager issue tracker.
ForegroundServiceStartNotAllowedException
Errore:
Il sistema genera ForegroundServiceStartNotAllowedException.
Causa:
In genere, questo problema si verifica quando l'app avvia un servizio in primo piano in background senza un'esenzione valida.
A partire da Android 12 (livello API 31), le app non possono avviare
servizi in primo piano mentre sono in esecuzione in
background, con alcune
esenzioni specifiche.
Se tenti di avviare un servizio in primo piano in background e non soddisfi i requisiti di una delle esenzioni, il sistema genera ForegroundServiceStartNotAllowedException. Il sistema esegue questa operazione anche se non soddisfi i requisiti dell'esenzione.
Ad esempio, un'app potrebbe avere un pulsante su cui un utente può fare clic, facendo in modo che l'app esegua un'elaborazione e poi avvii un servizio in primo piano. In questo caso, esiste il rischio che l'utente faccia clic sul pulsante e poi metta immediatamente l'app in background. L'app tenterà quindi di avviare il servizio in background. Se l'app non soddisfa una delle esenzioni specificate, il sistema genera un'eccezione ForegroundServiceStartNotAllowedException.
Inoltre, alcune esenzioni hanno un limite di tempo breve. Ad esempio, esiste una breve esenzione se l'app avvia un servizio in primo piano in risposta a un messaggio FCM ad alta priorità. Se non avvii il servizio abbastanza rapidamente, riceverai un'eccezione ForegroundServiceStartNotAllowedException.
Le esenzioni specifiche a volte diventano più restrittive con le nuove release di Android. Se hai modificato la versione di Android di destinazione della tua app, consulta la documentazione relativa alle modifiche apportate ai servizi in primo piano e verifica che la tua app soddisfi ancora una delle esenzioni consentite.
Correggi:
Modifica il flusso di lavoro dell'app in modo che non debba avviare servizi in primo piano mentre è in background oppure verifica che la tua app soddisfi una delle esenzioni.
Puoi utilizzare i componenti che tengono conto del ciclo di vita per gestire il ciclo di vita dell'app in modo da non tentare inavvertitamente di avviare un servizio in primo piano in background.
SecurityException
Errore:
Il sistema generaSecurityException.
Causa:
La tua app ha tentato di avviare un servizio in primo piano senza disporre delle autorizzazioni necessarie.
- Se un'app ha come target Android 9 (livello API 28) o versioni successive, deve disporre dell'autorizzazione
FOREGROUND_SERVICEper avviare un servizio in primo piano. - Se un'app ha come target Android 14 (livello API 34) o versioni successive, deve soddisfare tutti i prerequisiti per il tipo di servizio in primo piano. Questi prerequisiti sono
descritti nella documentazione relativa ai tipi di servizi in primo piano
. In particolare, tieni presente i seguenti requisiti:
- Diversi tipi di servizi in primo piano richiedono autorizzazioni di runtime specifiche. Ad esempio, un servizio in primo piano di messaggistica remota deve disporre dell'autorizzazione
FOREGROUND_SERVICE_REMOTE_MESSAGING.
- Diversi tipi di servizi in primo piano richiedono autorizzazioni di runtime specifiche. Ad esempio, un servizio in primo piano di messaggistica remota deve disporre dell'autorizzazione
- In diversi casi, esistono ulteriori limitazioni durante l'utilizzo delle autorizzazioni necessarie per alcuni tipi di servizi in primo piano. Queste autorizzazioni vengono concesse all'app
solo quando è in primo piano (con alcune
eccezioni specifiche). Ciò significa che, anche se la tua app ha richiesto e ottenuto una di queste autorizzazioni, se tenta di avviare il servizio in primo piano mentre è in background, il sistema genererà un'eccezione
SecurityException, anche se l'app dispone di un'esenzione per avviare un servizio in primo piano in background. Per saperne di più, consulta Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni durante l'utilizzo utilizzo.- Potresti ricevere un'eccezione
SecurityExceptionse hai richiesto le autorizzazioni necessarie, ma avvii il servizio in primo piano prima di confermare che le autorizzazioni richieste sono state concesse.
- Potresti ricevere un'eccezione
Correggi:
Prima di avviare il servizio in primo piano, richiedi tutte le autorizzazioni appropriate per il servizio in primo piano e verifica di aver soddisfatto tutti gli altri prerequisiti di runtime.