Foreground Service è un servizio Android che esegue operazioni di lunga durata visibili all'utente con una notifica obbligatoria nella barra di stato. A differenza di Background Service, che il sistema può arrestare in caso di carenza di risorse, Foreground Service riceve un'alta priorità e continua a funzionare anche in condizioni di memoria limitata. Secondo la documentazione di Android Developers, 2025, Foreground Service rimane l'unico modo affidabile per eseguire attività di lunga durata su dispositivi con Android 12 e versioni successive.
Punti chiave
Foreground Service è un componente Android progettato per eseguire operazioni che l'utente conosce e vede. Mostra una notifica persistente nel pannello delle notifiche che non può essere rimossa con uno swipe — rimane attiva finché il servizio è in esecuzione. Questa è la differenza principale rispetto a un servizio in background, che opera inosservato dall'utente.
Il sistema Android considera Foreground Service come un processo di importanza critica. Quando la RAM è scarsa, la piattaforma termina prima i Background Services, poi le Activity in cache, e solo in casi eccezionali — Foreground Service. L'OOM Killer assegna a tale servizio un livello ADJ 2, che praticamente elimina la sua terminazione forzata.
Per avviare Foreground Service, lo sviluppatore deve chiamare il metodo startForeground() entro pochi secondi dalla creazione del servizio, altrimenti il sistema genererà un'eccezione ForegroundServiceDidNotStartInTimeException. Questo è un requisito rigoroso della piattaforma introdotto per prevenire attività in background non dichiarate.
Il meccanismo Foreground Service è stato introdotto in Android 1.0 con il primo SDK, ma la notifica obbligatoria è apparsa in Android 9 (API 28). Prima di allora, un servizio poteva essere eseguito in primo piano senza un indicatore visibile all'utente. A partire da Android 9, Google ha inasprito i requisiti: qualsiasi applicazione che chiama startForeground deve fornire una notifica entro 5 secondi dall'avvio del servizio.
In Android 12 (API 31) sono state aggiunte restrizioni per l'avvio di Foreground Service da un contesto in background — ora l'autorizzazione FOREGROUND_SERVICE_SPECIAL_USE è richiesta per molti scenari. Android 14 (API 34) ha introdotto la dichiarazione obbligatoria di foregroundServiceType nel manifest, rendendo l'architettura dei servizi più trasparente e prevedibile.
Il meccanismo di funzionamento di Foreground Service si basa su tre fasi chiave: creazione del servizio, associazione della notifica ed esecuzione dell'attività. Il servizio eredita dalla classe Service e sovrascrive il metodo onStartCommand(), in cui viene chiamato startForeground() con un identificatore e un oggetto Notification.
Dopo aver chiamato startForeground(), il sistema sposta il processo del servizio nel gruppo in primo piano con priorità di sopravvivenza aumentata. Ciò significa che Android cercherà di mantenere il processo in esecuzione indipendentemente dal carico di RAM. Foreground Service non può essere arrestato dal sistema in condizioni normali — solo dall'utente che rimuove la notifica o chiamando esplicitamente stopSelf().
Il ciclo di vita di Foreground Service è gestito attraverso i metodi onCreate(), onStartCommand() e onDestroy(). In onStartCommand(), lo sviluppatore definisce la strategia di riavvio dopo la terminazione del processo — la costante START_STICKY forza il sistema a ricreare il servizio dopo il recupero delle risorse, mentre START_NOT_STICKY impedisce il riavvio automatico.
All'avvio di Foreground Service, i passaggi vengono eseguiti in sequenza: chiamata a startService(), creazione dell'oggetto Service in onCreate(), elaborazione dell'Intent in onStartCommand() e chiamata a startForeground() con un oggetto Notification. Se il servizio è già in esecuzione e arriva un nuovo Intent, viene chiamato solo onStartCommand() — onCreate() viene eseguito una sola volta durante la vita del servizio.
L'arresto di Foreground Service avviene tramite stopForeground() con il flag REMOVE_NOTIFICATION, che nasconde la notifica dalla barra di stato. Subito dopo aver rimosso la notifica, il sistema può smettere di considerare il servizio come in primo piano e ridurre la sua priorità a Background Service, rendendo il processo vulnerabile alla terminazione.
PowerManager svolge un ruolo importante nel funzionamento di Foreground Service, poiché le modalità di risparmio energetico di Android (Doze, App Standby) possono limitare la sua capacità di eseguire attività. Anche in stato di primo piano, il servizio è soggetto alle politiche della batteria — le richieste di rete possono essere ritardate e i timer sincronizzati con le finestre Doze. Per operazioni di lunga durata tolleranti ai ritardi, si consiglia di utilizzare Foreground Service in combinazione con WorkManager.
A partire da Android 14 (API 34), Google ha introdotto la dichiarazione obbligatoria del tipo di Foreground Service nel manifest. Ogni tipo definisce uno scenario di utilizzo consentito — il sistema verifica la conformità tra il tipo dichiarato e il comportamento effettivo del servizio. Esistono 9 tipi in totale, ma i più comunemente utilizzati sono i seguenti.
Il tipo dataSync è progettato per la sincronizzazione dei dati tra dispositivo e server, trasferimenti di file e backup. Gli esempi includono il caricamento di foto sull'archiviazione cloud, la sincronizzazione del database con Firebase o il caricamento di log su un server remoto. Questo tipo richiede di specificare la giustificazione nel manifest tramite l'attributo android:foregroundServiceType="dataSync".
Il tipo mediaPlayback viene utilizzato per la riproduzione di audio e video in background — lettori musicali, client di podcast, lettori video. È l'unico tipo che può funzionare indefinitamente senza intervento dell'utente. Il canale di notifica deve avere alta priorità e mostrare i controlli di riproduzione — pulsanti play, pausa, successivo, precedente tramite MediaStyle.
Il tipo location è destinato ai servizi di geolocalizzazione — app di navigazione, tracciamento dell'attività, geofencing. Per Android 14+, è necessario dichiarare l'autorizzazione FOREGROUND_SERVICE_LOCATION e specificare il tipo nel manifest. L'applicazione deve avere un'autorizzazione di posizione attiva in fase di esecuzione, altrimenti il sistema rifiuterà l'avvio del servizio.
| Tipo | Autorizzazione | Esempio di utilizzo |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | Sincronizzazione file con il cloud |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | Lettore musicale in background |
| location | FOREGROUND_SERVICE_LOCATION | Navigatore GPS durante la guida |
| camera | FOREGROUND_SERVICE_CAMERA | Applicazione di videosorveglianza |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | Lavoro con dispositivo BLE |
La differenza chiave tra Foreground e Background Service è la presenza di una notifica visibile e della priorità di sopravvivenza. Background Service può essere arrestato dal sistema in qualsiasi momento quando la memoria è scarsa, mentre Foreground Service continua a funzionare grazie all'elevato livello adj del processo nel meccanismo Low Memory Killer di Android.
Background Service non richiede notifica e può essere eseguito inosservato dall'utente. Tuttavia, a partire da Android 8 (API 26), Google ha limitato significativamente i servizi in background: startService() da un contesto in background non funziona più e Context.startForegroundService() è diventato obbligatorio per avviare qualsiasi servizio che intende passare in primo piano. Il sistema ha anche introdotto i Limiti di esecuzione in background — un timer (attualmente 10 minuti) dopo il quale Background Service viene fermato forzatamente.
Foreground Service, al contrario, non ha limiti di tempo. Il servizio può funzionare per ore o giorni — fino a quando l'utente non lo ferma esplicitamente o riavvia il dispositivo. Ciò rende Foreground Service la scelta ottimale per le applicazioni che richiedono lavoro continuo in background: lettori musicali, tracker di attività, app di chiamate VoIP.
| Parametro | Foreground Service | Background Service |
|---|---|---|
| Notifica | Obbligatoria | Non richiesta |
| Durata | Senza limiti | Fino a 10 minuti (API 26+) |
| Priorità sistema | Alta (ADJ 2) | Bassa (ADJ 8+) |
| Avvio API 26+ | startForegroundService() | Vietato dallo sfondo |
A partire da Android 12 (API 31), Google ha introdotto restrizioni significative per l'avvio di Foreground Service. Il cambiamento principale è il divieto di chiamare startForegroundService() da un contesto in background per la maggior parte dei tipi di servizio. Le eccezioni si applicano solo quando l'utente ha dato esplicito consenso (ad esempio, tramite l'autorizzazione FOREGROUND_SERVICE_SPECIAL_USE) o quando il servizio viene avviato in risposta all'intento di trasmissione BOOT_COMPLETED.
Il manifest dell'applicazione con API target 34+ deve contenere un blocco foregroundServiceType per ogni servizio dichiarato. Ad esempio, per un servizio di sincronizzazione dati, specificare android:foregroundServiceType="dataSync". Se il tipo non viene specificato, il sistema considera il servizio non valido e genera un'eccezione MissingForegroundServiceTypeException al tentativo di avvio. Google Play verifica anche la conformità dei tipi e può rifiutare la pubblicazione in caso di mancata corrispondenza.
In Android 14 (API 34), ogni tipo di Foreground Service ha un'autorizzazione corrispondente. Lo sviluppatore deve dichiararle nel manifest e richiederle in fase di esecuzione prima di avviare il servizio. Per dataSync è richiesto FOREGROUND_SERVICE_DATA_SYNC; per mediaPlayback è richiesto FOREGROUND_SERVICE_MEDIA_PLAYBACK. L'utente può revocare l'autorizzazione nelle impostazioni, il che fermerà il servizio attivo.
Google ha anche introdotto il meccanismo Foreground Service Notification Timeout in Android 14: se il servizio non chiama startForeground() entro 10 secondi dalla creazione, il sistema genera un'eccezione. Questo inasprimento mira a contrastare le applicazioni che ritardano o saltano la chiamata di notifica, funzionando effettivamente come Background Service sotto le spoglie di foreground.
Foreground Service viene utilizzato in un'ampia gamma di attività che richiedono un'esecuzione garantita in background. Gli scenari più comuni includono la riproduzione multimediale, il tracciamento della geolocalizzazione, la sincronizzazione dei dati e il lavoro con dispositivi periferici. Esaminiamo ciascuno di essi in dettaglio.
Un esempio classico è un lettore musicale che continua la riproduzione dopo aver minimizzato l'applicazione. Il servizio si avvia con una notifica MediaStyle, pulsanti di controllo e utilizza il tipo mediaPlayback. L'utente vede le informazioni sul brano nella barra di stato e può controllare la riproduzione senza aprire l'applicazione.
Le applicazioni di navigazione utilizzano Foreground Service di tipo location per il tracciamento continuo delle coordinate. Il servizio mostra una notifica con la velocità corrente, il tempo di percorrenza e un pulsante per fermare il tracciamento. Senza Foreground Service, il sistema smetterebbe di ricevere le coordinate in background dopo pochi minuti, rendendo la navigazione impossibile.
Le applicazioni di chiamate vocali e video — client VoIP — utilizzano Foreground Service per mantenere una connessione attiva. Il servizio di tipo phoneCall (da Android 14) garantisce che una chiamata non cada durante la minimizzazione dell'applicazione. La notifica mostra la durata della chiamata e i controlli del microfono e dell'altoparlante.
Vediamo la creazione di un Foreground Service in Kotlin per la sincronizzazione dei dati. Il servizio verrà avviato da un'Activity, mostrerà una notifica con progresso e terminerà correttamente dopo il completamento. L'esempio dimostra tutti gli elementi obbligatori: dichiarazione nel manifest, canale di notifica, chiamata a startForeground() e gestione di foregroundServiceType.
class SyncService : Service() {
companion object {
const val CHANNEL_ID = "sync_channel"
const val NOTIFICATION_ID = 1001
}
override fun onCreate() {
super.onCreate()
createNotificationChannel()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = buildNotification()
startForeground(NOTIFICATION_ID, notification)
performSync()
return START_STICKY
}
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID,
"Sincronizzazione",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Canale di sincronizzazione dati"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Sincronizzazione")
.setContentText("Caricamento dati sul server")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// Emulazione sincronizzazione
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Affinché il servizio funzioni correttamente su Android 12+, è necessario dichiarare Foreground Service in AndroidManifest.xml specificando il tipo e le autorizzazioni necessarie. L'attributo foregroundServiceType è obbligatorio per l'API target 34+, e le autorizzazioni FOREGROUND_SERVICE_DATA_SYNC e POST_NOTIFICATIONS devono essere richieste in fase di esecuzione.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission
android:name="android.permission.POST_NOTIFICATIONS" />
<application ...>
<service
android:name=".SyncService"
android:foregroundServiceType="dataSync"
android:exported="false" />
</application>
Nonostante la sua elevata affidabilità, Foreground Service ha delle limitazioni. La principale è la visibilità per l'utente. L'applicazione non può eseguire attività lunghe in background senza una notifica, il che non è sempre accettabile dal punto di vista dell'UX. Inoltre, il sistema può fermare forzatamente anche un Foreground Service quando viene superato il limite di tempo per alcuni tipi — ad esempio, dataSync è limitato a diverse ore di funzionamento.
Un'alternativa a Foreground Service è WorkManager, una libreria Android Jetpack per attività in background differite. WorkManager garantisce l'esecuzione dell'attività anche dopo il riavvio del dispositivo e supporta catene di attività, operazioni periodiche e vincoli di rete e batteria. Per la maggior parte delle operazioni in background, Google raccomanda WorkManager anziché un servizio diretto.
JobScheduler è un'API Android integrata per pianificare attività. È adatto per operazioni che possono essere differite: sincronizzazione Wi-Fi, download di dati quando collegato al caricabatterie. JobScheduler raggruppa le attività in finestre per risparmiare batteria, a differenza di Foreground Service che funziona in continuazione indipendentemente dallo stato di risparmio energetico.
Per attività brevi (fino a 10–15 secondi), è possibile utilizzare CoroutineWorker di WorkManager con esecuzione ritardata. Se un'attività deve essere eseguita rigorosamente in un momento specifico, si utilizza AlarmManager insieme a BroadcastReceiver. Pertanto, Foreground Service è una soluzione per operazioni continue di lunga durata, non uno strumento universale per tutti gli scenari in background.
Domande frequenti
Foreground Service è un servizio Android con una notifica persistente nella barra di stato che esegue attività di lunga durata visibili all'utente. Ha un'alta priorità di sopravvivenza e non viene arrestato dal sistema in caso di memoria insufficiente, a differenza di Background Service.
Foreground Service mostra una notifica obbligatoria, non ha limiti di tempo ed è protetto dall'arresto del sistema. Background Service è invisibile all'utente, funziona fino a 10 minuti (API 26+) e può essere arrestato da Low Memory Killer in qualsiasi momento.
Android 14 definisce 9 tipi: dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, health e remoteMessaging. Ogni tipo richiede un'autorizzazione corrispondente e la dichiarazione nel manifest tramite l'attributo foregroundServiceType.
Se il servizio non chiama startForeground() entro 10 secondi dalla creazione (Android 14), il sistema genera un'eccezione ForegroundServiceDidNotStartInTimeException e arresta forzatamente il servizio. L'applicazione riceverà anche un ANR (Application Not Responding) se l'operazione è in esecuzione sul thread principale.
No, nascondere la notifica di Foreground Service programmaticamente è impossibile. A partire da Android 9 (API 28), la notifica è obbligatoria e non può essere rimossa dall'utente. L'unico modo per rimuoverla è fermare il servizio chiamando stopForeground(REMOVE_NOTIFICATION) e stopSelf().
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche