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 illustra i seguenti problemi:
Prima di procedere alla risoluzione dei problemi
Verificare se sono state apportate modifiche recenti 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 spesso apportano modifiche al comportamento dei servizi in primo piano per limitare questi effetti negativi.
Se hai problemi con i servizi in primo piano, devi controllare la documentazione relativa alle modifiche ai servizi in primo piano e verificare se sono state apportate modifiche recenti che potrebbero spiegare i problemi. È particolarmente importante verificare la presenza di modifiche nelle seguenti condizioni:
- Il codice del servizio in primo piano che in precedenza funzionava ora non funziona
- Hai appena iniziato a eseguire test su una nuova release della piattaforma o hai modificato il livello API scelto come target per la tua app
Inoltre, se stai testando il tuo dispositivo su una versione di anteprima per sviluppatori della piattaforma, assicurati di controllare la versione più recente della documentazione relativa alla versione di anteprima per sviluppatori.
Errori ANR (L'applicazione non risponde)
In determinate circostanze, un'app dovrebbe arrestare il servizio in primo piano. Se l'app non interrompe il servizio, il sistema lo interrompe e attiva un errore L'applicazione non risponde (ANR).
Il servizio breve viene eseguito per troppo tempo causando ANR
I servizi in primo piano che utilizzano il tipo di servizio breve devono essere completati rapidamente, entro circa tre minuti. Allo scadere del tempo, il sistema chiama il metodo Service.onTimeout(int,int)
del servizio. Il servizio ha alcuni secondi di tempo per chiamare stopSelf()
. Se il servizio non si arresta, il sistema attiva un errore L'applicazione non risponde (ANR).
Diagnosi:
Se l'ANR è stato causato dall'interruzione di un servizio in primo piano, il sistema genera un'eccezione interna. Puoi verificare che si tratti del problema controllando Logcat. In questo caso, il log include 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]"
Correzione:
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.
Implementa Service.onTimeout(int,int)
nei tuoi servizi in primo piano.
Assicurati che l'implementazione di questo metodo chiami stopSelf()
immediatamente.
Eccezioni per i servizi in primo piano
Questa sezione descrive diversi problemi relativi ai servizi in primo piano che possono causare un'eccezione nel sistema. Se l'app non intercetta l'eccezione, l'utente visualizza una finestra di dialogo che lo informa che l'app si è interrotta.
In alcuni casi, il sistema genera un'eccezione interna. Non puoi rilevare queste eccezioni, ma puoi controllare in Logcat quale eccezione è stata generata.
Eccezione interna: timeout superato
Il sistema impone un limite al tempo di esecuzione dei servizi in primo piano per l'elaborazione di contenuti multimediali e la sincronizzazione dei dati quando 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 chiamarestopSelf()
. Se il servizio non si arresta, il sistema genera un'eccezione interna che causa l'arresto anomalo dell'app.
Diagnosi:
Se la causa è il superamento del timeout, Logcat include il seguente messaggio:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
Correzione:
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.
Implementa Service.onTimeout(int,int)
nei tuoi servizi in primo piano.
Assicurati che l'implementazione di questo metodo chiami stopSelf()
immediatamente.
Eccezione interna: ForegroundServiceDidNotStartInTimeException
Quando avvii un servizio chiamando
context.startForegroundService()
,
il servizio ha alcuni secondi per promuoversi a servizio in primo piano chiamando
ServiceCompat.startForeground()
.
Se il servizio non lo fa, il sistema attiva un errore ANR.
Diagnosi:
Se un servizio in primo piano non è stato avviato in tempo, l'app si arresta in modo anomalo e l'utente visualizza una finestra di dialogo L'app si è arrestata. In questo caso, in Logcat puoi trovare il seguente messaggio:
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()
Correzione:
Assicurati che tutti i servizi in primo piano appena creati chiamino
ServiceCompat.startForeground()
entro pochi secondi.
ForegroundServiceStartNotAllowedException
Errore:
Il sistema genera un'eccezione ForegroundServiceStartNotAllowedException
.
Causa:
Questo problema è in genere causato dall'avvio di un servizio in primo piano da parte dell'app in background quando non è presente un'esenzione valida.
A partire da Android 12 (livello API 31), le app non sono autorizzate ad avviare servizi in primo piano mentre sono in esecuzione in background, con alcune esenzioni specifiche.
Se provi ad avviare un servizio in primo piano dal background e non soddisfai i requisiti di una delle esenzioni, il sistema genera un 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, che fa sì che l'app esegua alcune elaborazioni e poi avvii un servizio in primo piano. In questo caso,
esiste il rischio che l'utente faccia clic sul pulsante e poi metta subito l'
app in background. In questo caso, l'app tenterà di avviare il servizio
dall'background. Se l'app non soddisfa una delle esenzioni specificate,
il sistema genera un ForegroundServiceStartNotAllowedException
.
Inoltre, alcune esenzioni hanno un breve limite di tempo. Ad esempio, è prevista una breve esenzione se la tua app avvia un servizio in primo piano in risposta a un messaggio FCM ad alta priorità. Se non avvii il servizio abbastanza rapidamente, viene visualizzato un ForegroundServiceStartNotAllowedException
.
A volte le esenzioni specifiche 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 ai servizi in primo piano e verifica che la tua app soddisfi ancora una delle esenzioni consentite.
Correzione:
Modifica il flusso di lavoro dell'app in modo che non debba avviare i servizi in primo piano mentre è in background oppure verifica che l'app soddisfi una delle esenzioni.
Puoi utilizzare componenti del ciclo di vita come LiveData
per gestire il ciclo di vita della tua app in modo da non tentare inavvertitamente di avviare un servizio in primo piano in background.
SecurityException
Errore:
Il sistema genera un'eccezioneSecurityException
.
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_SERVICE
per 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 illustrati nella documentazione relativa ai tipi di servizi in primo piano. In
particolar modo, 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 per le 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 l'app tenta di avviare il servizio in primo piano mentre è in background, il sistema restituirà un
SecurityException
anche se l'app dispone di un'esenzione per avviare un servizio in primo piano da in background. Per ulteriori informazioni, consulta Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni in uso.- Potresti visualizzare un
SecurityException
se hai richiesto le autorizzazioni necessarie, ma hai avviato il servizio in primo piano prima di verificare che le autorizzazioni richieste siano state concesse.
- Potresti visualizzare un
Correzione:
Prima di avviare il servizio in primo piano, richiedi tutte le autorizzazioni per i servizi in primo piano appropriate e verifica di aver soddisfatto tutti gli altri prerequisiti di runtime.