2009-12-22 19 views
88

Sto creando un'applicazione di ricerca eventi, impostiamo i criteri di ricerca da una schermata popolata in un'altra schermata, quindi l'utente può modificare i criteri di ricerca dalla terza schermata e passa alla quarta schermata.Ciclo di vita dell'oggetto statico Android

Per ottenere sopra compito sto usando oggetto statico che ricorda i valori di tutto l'applicazione e non ho bisogno di fare qualsiasi cosa in più.

ma temo se stesse statica ciclo di vita dell'oggetto in Android se memoria bassa trovata Android eliminare oggetti statici ???

Come Android supporta multitasking, se l'utente passa a un'altra applicazione e quando l'utente torna inizio applicazione in qualità folle, non oggetto statico vengono rimossi quando compito più ??? qualche idea ?? e anche suggerire di tenere oggetto statico tramite metodo singleton è un approccio migliore ???

risposta

215

Iniziamo con un po 'di background: cosa succede quando si avvia un'applicazione?
Il sistema operativo avvia un processo e lo assegna a un ID processo univoco e alloca una tabella di processo. Un processo avvia un'istanza di DVM (Dalvik VM); Ogni applicazione viene eseguita all'interno di un DVM.
Un DVM gestisce classe di carico scarico, esempio del ciclo di vita, GC ecc

durata di una variabile statica: Una variabile statica viene all'esistenza quando una classe viene caricato dalla JVM e muore quando la classe viene scaricato.

Quindi, se si crea un'applicazione Android e inizializzare una variabile statica, rimarrà nella JVM finché una delle seguenti circostanze:
1. la classe viene scaricato
2. JVM si spegne
3. il processo muore

noti che il valore della variabile statica persisterà quando si passa ad una diversa attività di un'altra applicazione e nessuna delle precedenti tre succede. Se uno dei tre precedenti dovesse accadere, lo statico perderà il suo valore.

È possibile verificare questo con poche righe di codice:

  1. stampa il inizializzato statico nel onCreate della vostra attività -> dovrebbe stampare nulla
  2. inizializzare la statica. stampalo -> valore non è nullo
  3. Premi il pulsante Indietro e vai alla schermata principale. Nota: la schermata principale è un'altra attività.
  4. Avvia di nuovo l'attività -> la variabile statica non è nulla
  5. Elimina il processo dell'applicazione da DDMS (pulsante di arresto nella finestra dei dispositivi).
  6. Riavvia la tua attività -> lo statico avrà valore nullo.

Spero che questo aiuti.

+11

Questa è una grande spiegazione e dovrebbe essere richiesta la lettura per qualsiasi sviluppatore Android. –

+1

Voglio sapere perché ho perso il valore del campo nell'oggetto dell'applicazione se non è statico quando avvio una nuova attività, ad esempio dichiaro la pagina corrente variabile nell'oggetto applicazione e il suo valore torna sempre a zero quando apro la nuova attività –

+0

quando chiamo super.onRestoreInstanceState (savedInstanceState); Perdo la mia variabile anche se sono statici, qual è il problema? –

14

Bene, lo schema Singleton si basa anche sull'utilizzo di variabili statiche, quindi in realtà ci si troverà nella stessa posizione. Sebbene l'approccio statico possa funzionare la maggior parte delle volte, può succedere che in alcuni casi, quando la memoria è piena e un'altra attività prenda il primo piano prima che l'applicazione passi alla schermata successiva, il processo della tua attività potrebbe essere interrotto e perdere i valori statici. Tuttavia Android offre alcune opzioni di persistere valori tra stati o trasmissione come ad esempio:

  • utilizzando un Intent, si potrebbe passare lungo tuoi criteri di ricerca dall'attività di attività (simile ad un web http richiesta)
  • utilizzando le preferenze dell'applicazione, è potrebbe salvare i valori e recuperare loro l'attività che ha bisogno di loro
  • utilizzando il database SQLite è possibile loro persistere in una tabella e recuperare in un secondo momento
  • se avete bisogno di salvare solo l'attività stato in modo che al riavvio, i campi si riempiono con i loro valori precedentemente selezionati, è possibile implementare il metodo onSaveInstanceState() Attività - notare che questo non è raccomandato per tra attività persistenza degli stati.

È possibile ottenere alcuni esempi di codice di utilizzo delle preferenze, intenti e il database SQLite, cercando al aegis-shield source code tree nel codice di Google o in altre applicazioni Android open source.

3

Dopo alcune ricerche, si scopre che l'utilizzo di applicazioni per archiviare single che non è grande di un'idea, a meno che non si è pronti a ricrearlo:

Don't store data in the application object

così mentre the accepted answer è tecnicamente corretta, non fornisce tutte le informazioni.

Come suggerisce il collegamento sopra riportato, se si desidera realmente attenersi a tale modello, è necessario essere pronti per verificare la presenza di null e ricreare i dati, se possibile.

1

@ r1k0 è proprio qui. Memorizzare i dati nei campi statici di una classe non persisterà da solo nel processo di applicazione uccide e riavvia. Android uccide regolarmente i processi (applicazioni in esecuzione) quando ha bisogno di memoria.

Per il doc Android: Activity state and ejection from memory,

Il sistema non uccide direttamente un'attività. Invece, uccide il processo in cui viene eseguita l'attività, distruggendo non solo l'attività ma anche tutte le altre operazioni in esecuzione nel processo.

È possibile salvare e ripristinare lo stato di primitive e oggetti serializzabili e parcellari utilizzando i metodi seguenti. Questi vengono chiamati automaticamente durante il normale ciclo di vita delle attività.

protected void onSaveInstanceState(Bundle state) {} 
protected void onRestoreInstanceState(Bundle savedInstanceState){} 

Quindi, se si dispone di una classe che ha solo variabili statiche, è possibile salvare lo stato di ogni campo in onSaveInstanceState() e ripristinarli in onRestoreInstanceState(). Quando Android uccide il processo in cui la tua app è in esecuzione, lo stato delle tue variabili verrà salvato e, quando Android ripristinerà la tua app, i valori verranno ripristinati nella memoria nello stesso stato di prima.

Problemi correlati