2011-11-17 15 views
6

Utilizzo di Android 2.1+. Ho un servizio che viene occasionalmente ucciso dal sistema operativo (a causa della pressione della memoria, suppongo).Servizio Android ucciso e variabili statiche

Questo servizio gestisce alcuni stati che utilizzano campi di classi membri statici. Mi aspetto che i campi statici mantengano i loro valori nonostante il servizio venga ucciso e riavviato dal sistema operativo.

Ma sembra che non succeda così. Dopo un riavvio, le variabili statiche vengono ripristinate al valore predefinito. E 'quello che dovrebbe succedere? Dovrei usare un altro modo per mantenere uno stato persistente nonostante kill/restart?

risposta

6

Sì, questo è ciò che accade quando il servizio viene ucciso. Il programma viene estratto dalla memoria e quando viene ricaricato in memoria, vengono presi in considerazione i valori predefiniti per le variabili statiche. In altre parole, il codice byte per il tuo programma non può cambiare da esecuzione a esecuzione.

In genere è considerato negativo utilizzare variabili statiche per mantenere lo stato. Prova a memorizzarli in una memoria preistente, come un database sqlite.

+1

Vorrei anche specificare che, poiché i campi statici vengono ripristinati, questo significa che il sistema operativo uccide l'intero processo Java dell'app. E sì, questo succede di tanto in tanto, controlla questo post - http://stackoverflow.com/questions/708012/android-how-to-declare-global-variables/4642069#4642069 –

+1

Android non fornisce davvero alcun mezzo per mantenere persistente stato di scrittura a lampeggiare ogni volta? (ad esempio, onDestroy non è garantito per essere chiamato !!!?) Il mio servizio cambia stato un sacco e questo aumenterebbe l'utilizzo della batteria e accelerare il wearout flash se devo toccare il flash ogni volta che lo stato cambia! – Michael

+0

@Michael Dalla [documentazione per il metodo onDestroy] (https://developer.android.com/reference/android/app/Activity.html#onDestroy()): Nota: non contare su questo metodo chiamato come un posto per il salvataggio dei dati! Ad esempio, se un'attività sta modificando i dati in un fornitore di contenuti, tali modifiche devono essere eseguite in onPause() o onSaveInstanceState (Bundle), non qui. –

Problemi correlati