2013-03-21 14 views
16

Szenario:

Ich habe vier Aktivitäten in meiner Applikation für Android lässt, sagen A, B, C und D. Es gibt eine Constants.java Klasse in der App, die Application Klasse erstreckt, um globale Anwendungs ​​Zustand zu halten. Die Konstantenklasse enthält alle Konstantenvariablen der App. Der Aktivitätsfluss ist wie folgt: A-->B-->C-->D. Wenn die Zurück-Taste von Aktivität A gedrückt wird, rufe ich die Methode finish() auf, die die Aktivität A beendet und die Anwendung schließt. Wenn ich danach die App von allen Apps aus öffne, gibt es eine Variable in Constants.java, deren Wert vom letzten Start an erhalten bleibt. Die gleiche Sache passiert nicht, wenn ich mache System.exit(10) gefolgt von Process.killProcess(Process.myPid()) von Aktivität A (auf der Rückseite gedrückt).Was passiert, wenn alle Aktivitäten einer Anwendung abgeschlossen sind?

Fragen:

  1. Werden alle Aktivitäten Veredelung von finish() jeder Aktivität Aufruf wird die Anwendung (Sein Prozess) in der Nähe?
  2. Wie bleibt der Wert einer Variablen bestehen, selbst wenn alle Aktivitäten abgeschlossen sind (geschlossen)?
  3. Ist es fair, System.exit(10) gefolgt von Process.killProcess(Process.myPid()) zum Beenden der Anwendung aufzurufen?

Update:

Wie kann ich die Anwendung Konstanten beim Beenden der Anwendung (Zurück Drücken der HomeActivity) löschen?

+1

Konstanten per Definition nicht ändern, also warum die Mühe, sie zu löschen? – m0skit0

+0

Einfach: Rufen Sie 'System.exit()' nicht auf (wird überhaupt nicht empfohlen, wie in SO beschrieben). Löschen Sie einfach die Variablen, wenn HomeActivity beendet ist. –

Antwort

14

1) Nein, Android garantiert dies nicht. Es obliegt dem Betriebssystem zu entscheiden, ob der Prozess beendet werden soll oder nicht.

2) Weil die Activity Instanz immer noch in der Dalvik VM vorhanden ist. In Android hat jeder Prozess eine separate Dalvik-VM.

Jeder Prozess hat seine eigene virtuelle Maschine (VM), so dass eine Code läuft aus anderen Anwendungen in Isolation der Anwendung.

Wenn Sie finish() anrufen, bedeutet dies nicht, dass die Activity Instanz Garbage Collection ist. Sie sagen Android Sie wollen schließen die Activity (nicht mehr zeigen). Es wird immer noch vorhanden sein, bis Android entscheidet, den Prozess zu beenden (und damit den DVM zu beenden), oder die Instanz wird durch Garbage Collection gesammelt.

Android startet den Prozess, wenn eine der Komponenten der Anwendung Bedarf ausgeführt werden, schaltet dann den Prozess ab, wenn es nicht mehr benötigt oder wenn das System muss für andere Anwendungen Speicher wiederherzustellen.

3) Ich würde es nicht tun, außer Sie haben einen sehr starken Grund. Als Faustregel sollten Sie Android behandeln lassen, wenn Sie Ihre Anwendung beenden möchten, es sei denn, es gibt etwas in Ihrem Anwendungszustand, das ein Zurücksetzen der Anwendung erfordert, wenn es den Fokus verliert.

Quotes source

+1

Ich lese auch irgendwo, dass Android entscheidet, wenn ein Prozess zu töten –

+0

@ nidhi_adiga das ist, was ich sagte: * "Es ist an das Betriebssystem zu entscheiden, ob der Prozess zu beenden oder nicht." * – m0skit0

+0

Nur zur Klärung: durch * "das Betriebssystem "* Ich meine Android Ofc. – m0skit0

5

Werden alle Aktivitäten Veredelung von finish() jeder Aktivität Aufruf wird die Anwendung (Sein Prozess) in der Nähe?

Nein, sollte es nicht. Dies liegt daran, dass Aktivitäten nicht die einzige Komponente einer App sind. Dienste, BroadcastReceiver können weiterhin ohne eine Benutzeroberfläche ausgeführt werden. Indem der Anwendungsprozess so lange wie möglich ausgeführt wird, sorgt Android für eine schnellere Reaktion des Benutzers beim erneuten Öffnen der App oder für einen schnelleren Start von Diensten usw., da die Anwendungsinstanz nicht neu erstellt werden muss.

Ihr Prozess wird nur beendet, wenn Sie oder eine andere Anwendung ihn explizit beenden, oder das System tötet ihn, um Ressourcen freizugeben.

Wie bleibt der Wert einer Variablen bestehen, selbst wenn alle Aktivitäten abgeschlossen sind (geschlossen)?

Ihre Variablen sind in der Application-Klasse, die ein Singleton-Modell folgt, und somit wird Ihr Wert bestehen, bis der gesamte App Prozess abgebrochen wird.

Zusätzlich ruft finish() nur onDestroy(), das ist kein Dekonstruktor, wie erklärt here. Daher können selbst Aktivitätsvariablen nach dem Aufruf von finish weiter bestehen, da Ihre Instanz immer noch so lange verfügbar ist, bis Android das Bedürfnis hat, sie zu zerstören, oder Ihr Prozess wird beendet.

Ist es fair, System.exit (10) gefolgt von Process.killProcess (Process.myPid()) zum Beenden der Anwendung aufzurufen?

Während dies die App töten wird, wird es nicht empfohlen. Siehe this Frage für eine Vielzahl von Gründen dafür.

+1

+1 für den angegebenen Link und Erklärung. – Raghunandan

0

Android behält den Prozess bei, bis er den Prozessspeicher zurückgewinnen muss. Wenn der Benutzer sofort zu Ihrer Anwendung zurückkehrt, wird Ihre Anwendung schneller angezeigt.

Der Wert bleibt bestehen, bis die Anwendung beendet wird.

Sollte System.exit (10) gefolgt von Process.killProcess (Process.myPid()) nicht zum Beenden der Anwendung verwendet werden?

Sie sollten wirklich darüber nachdenken, die Anwendung nicht zu beenden. So funktionieren Android-Apps normalerweise nicht.

2

für Ihre Update:

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

Aufschalten onBackPressed in Ihrem HomeActivity und vor Aufruf super.onBackPressed() klar all die Variable. Wenn Sie einen Setter für einen String befindet sich in Ihrem Anwendungsunterklasse haben:

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

wenn Sie viel Zustände haben löschen können Sie eine Methode schreiben wich alle Felder zurückgesetzt und es nennen:

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

Of Natürlich müssen diese Felder nicht als final oder static final markiert werden

Verwandte Themen