Questa pagina illustra alcuni motivi comuni per cui i servizi in primo piano possono non funzionare e ti aiuta a identificare la causa del problema.
Questo documento tratta i seguenti problemi:
Prima di procedere alla risoluzione dei problemi
Controllare le 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, consulta la documentazione relativa alle modifiche 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 funzionava in precedenza 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, un'app deve 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 troppo a lungo causando ANR
I servizi in primo piano che utilizzano il tipo short service
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
pochi secondi per chiamare stopSelf()
. Se il servizio non
si arresta autonomamente, il sistema attiva un errore L'applicazione non risponde.
Diagnostica:
Se l'errore ANR è stato causato dall'interruzione di un servizio in primo piano, il sistema genera un'eccezione interna. Puoi verificare che questo sia il problema controllando i report ANR. Se questo è il problema, 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]"
Correzione:
Assicurati che tutti i servizi in primo piano a tempo limitato terminino il loro lavoro e chiamino
stopForeground(int)
entro il limite di tempo del sistema.
I tuoi servizi in primo piano devono implementare Service.onTimeout(int,int)
.
Assicurati che l'implementazione di questo metodo chiami subito stopSelf()
.
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 rileva l'eccezione, l'utente visualizza una finestra di dialogo che indica che l'app si è arrestata.
In alcuni casi, il sistema genera un'eccezione interna. In questi casi puoi scoprire qual è stata l'eccezione cercandola nell'analisi dello stack e puoi controllare Logcat per informazioni più dettagliate sull'errore.
Eccezione interna: timeout superato
Il sistema impone un limite alla durata di esecuzione dei servizi in primo piano di sincronizzazione dei dati e di 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 autonomamente, il sistema genera un
RemoteServiceException
interno che causa l'arresto anomalo dell'app.
Diagnostica:
Puoi scoprire qual è stata l'eccezione cercando nell'analisi dello stack e puoi controllare Logcat per informazioni più dettagliate sull'errore. In questo caso, Logcat mostra 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]"
Correzione:
Assicurati che tutti i servizi in primo piano con limiti di tempo terminino il lavoro e chiamino
stopForeground(int)
entro il limite di tempo del sistema.
I tuoi servizi in primo piano devono implementare Service.onTimeout(int,int)
.
Assicurati che l'implementazione di questo metodo chiami subito stopSelf()
.
Eccezione interna: ForegroundServiceDidNotStartInTimeException
Quando avvii un servizio chiamando
context.startForegroundService()
,
questo ha pochi secondi per promuoversi a servizio in primo piano chiamando
ServiceCompat.startForeground()
.
Se il servizio non lo fa, genera un errore interno
ForegroundServiceDidNotStartInTimeException
.
Diagnostica:
Puoi scoprire qual è stata l'eccezione cercando nell'analisi dello stack e puoi controllare Logcat per informazioni più dettagliate sull'errore. In questo caso, Logcat mostra il seguente messaggio di errore:
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 ForegroundServiceStartNotAllowedException
.
Causa:
Ciò è 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 l'app è in esecuzione in
background, con
alcune esenzioni specifiche.
Se tenti di avviare un servizio in primo piano dal 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, il che fa sì che l'app esegua alcune elaborazioni e poi avvii un servizio in primo piano. In questo caso,
esiste il pericolo che l'utente faccia clic sul pulsante e poi metta immediatamente l'app in background. L'app tenterebbe quindi di avviare il servizio
in background. Se l'app non soddisfa una delle esenzioni specificate,
il sistema genera un ForegroundServiceStartNotAllowedException
.
Inoltre, alcune esenzioni hanno un limite di tempo breve. Ad esempio, è prevista 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, ricevi un ForegroundServiceStartNotAllowedException
.
A volte, le esenzioni specifiche diventano più restrittive con le nuove versioni di Android. Se hai modificato la versione di Android a cui fa riferimento la 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 della tua app in modo che non debba avviare servizi in primo piano mentre l'app è in background oppure conferma che la tua app soddisfa una delle esenzioni.
Puoi utilizzare i componenti sensibili al ciclo di vita per gestire il ciclo di vita della tua app in modo da non tentare inavvertitamente di avviare un servizio in primo piano dal 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_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
descritti in dettaglio nella documentazione sui tipi di
servizio in primo piano. In
particolare, tieni presente i seguenti requisiti:
- Diversi tipi di servizio 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 servizio 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'uso
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 l'app tenta di avviare il servizio in primo piano mentre è in background, il sistema genererà un errore
SecurityException
anche se l'app ha un'esenzione per avviare un servizio in primo piano dal background. Per saperne di più, consulta Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni durante l'utilizzo.- Potresti ricevere un
SecurityException
se 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
Correzione:
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.