2015-03-05 10 views
8

Ho una classe semplice per mantenere alcune variabili da condividere tra le attività nel mio gioco, qualcosa di simile a:Qual è il ciclo di vita di una variabile statica pubblica in Android?

public class TheGlobals { 
    public static boolean IsFullGame = false; 
} 

Ora, quando il lancio del gioco, l'attività iniziale è MainMenu, che determina se l'utente dispone acquistato il gioco completo e imposta la variabile di conseguenza. Ad esempio, nel caso l'utente abbia acquistato il gioco, lo farebbe

TheGlobals.IsFullGame = true; 

Fin qui tutto bene. Da qui, l'utente fa clic su Riproduci e passa all'attività di gioco in cui si verifica l'azione di gioco principale. In questa seconda attività (di gioco), ci sono alcuni punti in cui controllo se si tratta del gioco completo/acquistato accedendo a quella variabile statica globale e abilitando o disabilitando determinate funzionalità di conseguenza.

Ora, l'utente suona e ad un certo punto tocca il pulsante Home o passa ad altre app. Dopo un po 'di tempo, l'utente torna al mio gioco, lanciandolo dalle app recenti, che apre il gioco da dove erano state interrotte, cioè direttamente nella seconda attività (di gioco), e l'utente continua felicemente a giocare.

Sono corretto per supporre che a questo punto, il valore della mia variabile statica globale può essere Vero o Falso, a seconda se il processo è stato distrutto o no, o c'è alcuna garanzia che Android ripristinerà il suo valore. Sto pensando che se il processo è stato mantenuto in vita, allora il valore rimarrà Vero (come è stato impostato nella prima attività) e si è conservato finché il processo è stato mantenuto in vita; o se il processo è stato distrutto e l'utente ritorna in un secondo momento e apre il mio gioco direttamente nella seconda attività (Gioco), il valore della variabile statica globale in quel caso sarà impostato su False (proprio come è definito sulla classe livello e senza possibilità di essere impostato nella prima attività).

Grazie per eventuali commenti.

risposta

5

Ho ragione di ritenere che, a questo punto, il valore della mia variabile globale statica può essere sia vera o falsa, a seconda se il processo è stato distrutto o no, o c'è alcuna garanzia che Android sarà ripristinare il suo valore. Sto pensando che se il processo fosse mantenuto vivo , allora il valore rimarrà Vero (come è stato impostato nella prima attività ) e si è conservato fino a quando il processo è stato mantenuto in vita; oppure se il processo è stato distrutto e l'utente apre il mio gioco direttamente nella seconda attività (Gioco), quindi il valore globale della variabile statica in quel caso sarà impostato su False (proprio come è definito a livello di classe e senza possibilità di essere impostato in la prima attività).

Sì, sei corretto. A questo punto il processo è Processo di applicazione Android. Ancora il processo dell'applicazione in esecuzione ha valore persistente per la variabile TheGlobals.IsFullGame.

Ora, l'utente suona e ad un certo punto tocca il pulsante Home o cambia in altre app.Dopo un po 'di tempo, l'utente torna al mio gioco, avviandolo dalle app recenti, che apre il gioco dove sono state interrotte , che è direttamente nella seconda attività (Gioco), e l'utente continua tranquillamente a giocare.

Poiché l'applicazione è disponibile in attività in background significa che il processo di applicazione è in esecuzione in modo da ottenere valori corretti.

Ora Che dire,

  1. se il dispositivo ha problema poca memoria e l'applicazione è in background

sistema semplicemente Android uccidere il tuo processo di applicazione di rimanere altra applicazione stato di esecuzione, e hai trovato valore predefinito della variabile senza stato conservato

  1. Cosa succede se batteria scarica e altro caso eccezionale su cui il dispositivo è spento

Semplicemente all'avvio del dispositivo, l'utente deve avviare l'applicazione dall'inizio e nessuno stato permanente per la variabile, ha solo il valore predefinito.

Quindi, in questo scenario l'applicazione persistono valore della variabile fino al vostro un'applicazione in esecuzione e si è allocato spazio di memoria sul sistema (applicazione in esecuzione spazio sul dispositivo di RAM)

Soluzione:

Bisogna persistere valori delle variabili dell'applicazione fino al momento della vita dell'applicazione significa che l'applicazione non è stata disinstallata dal dispositivo, quindi è meglio usare SharedPreference per memorizzare il valore della variabile che rimane persistente finché non si modifica l'applicazione.

+0

@Levon - C'è qualcosa che mi è mancato dalla tua domanda? O non riesci a capire dalla mia risposta? – user370305

+0

grazie user370305, ho capito la tua risposta e l'ho accettata. In definitiva, ho deciso di non archiviare nulla nelle variabili globali, ma piuttosto di mantenere quei valori con SharedPreferences. In questo modo posso sempre ripristinarli in qualsiasi altra attività nella stessa sessione o tra rilanci dell'app. – Levon

0

Afaik l'intero programma è cancellato o meno. Quindi, se l'utente può tornare alla schermata di gioco IsFullGame è true, o l'app è stata distrutta il suo false.

+1

Non proprio. Se il gioco non è la prima attività, l'utente può avviarlo direttamente dal menu recents, e se l'applicazione è stata uccisa a causa della mancanza di memoria, quelle variabili non hanno mantenuto i loro valori. Questo può essere un problema reale se si dipende da questi valori globali impostati correttamente: devono essere persistenti su disco o è necessario rilevare che è un riavvio e non si dispone dei valori e riavviare l'attività iniziale con CLEAR_TOP bandiera. –

Problemi correlati