Risolvere i problemi relativi ai servizi in primo piano

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.
  • 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.

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.