2013-03-21 6 views
16

Scenario:

Ho quattro attività nella mia applicazione Android, consente di dire A, B, C e D. C'è un Constants.java di classe in app che si estende Application classe al fine di mantenere lo stato di applicazione globale. La classe Constants ha tutte le variabili costanti dell'app. Il flusso di attività è come questo A-->B-->C-->D. Quando si preme il pulsante Indietro dall'attività A, sto chiamando il metodo finish() che termina l'attività A e chiude l'applicazione. Dopodiché, se apro l'app da tutte le app, c'è una variabile in Constants.java il cui valore persiste dall'ultimo avvio. La stessa cosa non sta accadendo quando sto facendo System.exit(10) seguito da Process.killProcess(Process.myPid()) dall'attività A (sul retro premuto).Cosa succede quando tutte le attività di un'applicazione termina?

Domande:

  1. Will finitura tutte le attività chiamando finitura() di ogni attività si chiuderà l'applicazione (Il processo)?
  2. In che modo il valore di una variabile persiste anche se tutte le attività sono state completate (chiuse)?
  3. È corretto chiamare System.exit(10) seguito da Process.killProcess(Process.myPid()) per uscire dall'applicazione?

Aggiornamento:

Come posso cancellare le costanti applicazione in uscita dell'applicazione (Indietro stampa del HomeActivity)?

+1

Le costanti per definizione non cambiano, quindi perché preoccuparsi di eliminarle? – m0skit0

+0

Semplice: non chiamare 'System.exit()' (non consigliato affatto come discusso in SO). Basta cancellare le variabili quando HomeActivity è finito. –

risposta

14

1) No, Android non garantisce così. Spetta al sistema operativo decidere se interrompere il processo o meno.

2) Perché l'istanza Activity risiede ancora nella macchina virtuale Dalvik. In Android ogni processo ha una VM Dalvik separata.

Ogni processo ha una propria macchina virtuale (VM), quindi il codice di un'applicazione viene eseguito separatamente dalle altre applicazioni.

Quando si chiama finish() questo non significa che l'istanza Activity è garbage collection. Stai dicendo ad Android che vuoi chiudi il Activity (non mostrarlo più). Sarà ancora presente fino a quando Android non deciderà di terminare il processo (e quindi di terminare il DVM) o l'istanza verrà raccolta in modo improprio.

Android inizia il processo quando uno dei componenti dell'applicazione bisogno di essere eseguito, quindi spegne il processo quando non è più necessario o quando il sistema deve recuperare la memoria per altre applicazioni è.

3) Non lo farei se non si ha una ragione molto forte. Come regola generale, dovresti lasciare che Android gestisca quando uccidere la tua applicazione, a meno che non ci sia qualcosa nello stato della tua applicazione che richiede un reset dell'applicazione quando perde lo stato attivo.

Quotes source

+1

Ho anche letto da qualche parte che Android decide quando uccidere un processo –

+0

@nidhi_adiga è quello che ho detto: * "Dipende dal sistema operativo decidere se terminare il processo o meno." * – m0skit0

+0

Solo per chiarire: con * "il SO "* Intendo Android ofc. – m0skit0

5

Sarà terminato tutte le attività chiamando finitura() di ogni attività si chiuderà l'applicazione (Il processo)?

No, non dovrebbe. Questo perché le attività non sono l'unico componente di un'app. Servizi, BroadcastReceivers possono ancora funzionare senza un'interfaccia utente. Mantenendo il processo di applicazione attivo finché possibile, Android garantisce una risposta più rapida all'utente che apre nuovamente l'app, o un avvio più rapido dei servizi, ecc. Poiché l'istanza dell'applicazione non deve essere ricreata.

Il tuo processo verrà terminato solo se tu o un'altra app lo ucciderai esplicitamente o il sistema lo ucciderà per liberare risorse.

In che modo il valore di una variabile persiste anche se tutte le attività sono state completate (chiuse)?

La variabile si trova nella classe Application, che segue un modello Singleton e quindi il valore persisterà fino all'interruzione dell'intero processo dell'app.

Inoltre, finish() chiama solo onDestroy(), che non è un decostruttore, come spiegato here. Quindi anche le variabili di attività possono persistere dopo che è stato chiamato il traguardo, poiché l'istanza è ancora conservata finché Android non sente la necessità di distruggerlo o il processo viene ucciso.

È corretto chiamare System.exit (10) seguito da Process.killProcess (Process.myPid()) per uscire dall'applicazione?

Mentre questo uccide l'app, non è consigliabile. Vedere la domanda this per una serie di motivi.

+1

+1 per il collegamento fornito e la spiegazione. – Raghunandan

0

Android manterrà il processo fino a quando non sarà necessario recuperare la memoria del processo. In questo modo, se l'utente torna immediatamente alla tua applicazione, la tua applicazione apparirà più veloce.

Il valore persisterà fino all'uccisione dell'applicazione.

Non dovrebbe utilizzare System.exit (10) seguito da Process.killProcess (Process.myPid()) per uscire dall'applicazione?

Si dovrebbe davvero pensare di non uscire dall'applicazione. Questo non è il modo in cui le app Android di solito funzionano.

2

per il vostro Update:

How can I clear the application constants on exit of the application(Back press of the HomeActivity)? 

Override onBackPressed all'interno del vostro HomeActivity e prima chiamata super.onBackPressed() chiaro tutte le variabili. Se si dispone di un setter per una stringa che si trova all'interno sottoclasse Applicazione:

@Override 
public void onBackPressed() { 
    getApplication().setMyString(null); 
    super.onBackPressed(); 
} 

se avete stati molto da limpide è possibile scrivere un metodo di wich ripristinare tutti i campi e chiamarlo:

@Override 
public void onBackPressed() { 
    getApplication().clearAllMyFields(); 
    super.onBackPressed(); 
} 

Di Ovviamente questi campi non devono essere contrassegnati come final o static final