2009-04-07 21 views
6

Ich habe zwei Aktivitäten ausgeführt: mainActivity und childActivity. Wenn der Benutzer auf die Schaltfläche in mainActivity klickt, wird die childActivity gestartet. Was ich tun möchte, ist dies:Android: Wiederherstellen der aktiven Aktivität beim Fortsetzen der Anwendung

Wenn die aktive Tätigkeit ist die childActivity und der Benutzer die Home-Taste dann starten Sie die Anwendung klickt, möchte ich die childActivitystattmainActivity sehen das wird gestartet.

Ich hatte einige Vorschläge tatsächlich um arounds. Ich habe versucht, onStart, onRestart, onResume, onStop, onDestroy Ereignisse zu manipulieren. Aber sie haben das Problem nicht vollständig gelöst. Es sollte einen klugen Weg da draußen geben. Vielen Dank.

Edit:

Vielen Dank für die Antwort, Soonil. Der Fall, den Sie sagten, geschieht, wenn die Aktivität aus dem Fenster für die letzten Aktivitäten aufgerufen wird. (Das Fenster öffnete sich, wenn Sie die Home-Taste lange gedrückt halten). Dies geschieht nicht, wenn Sie es vom Startbildschirm aus öffnen. (wie das Öffnen von Anfang an) Ich glaube nicht, dass mein Code ein spezifisches Problem hat, um diesen Fehler zu erzeugen. Weil ich ein Testprojekt erstellt habe und selbstständig versucht habe, bevor ich die Frage gesendet habe und das gleiche Problem hatte. Wie auch immer, hier ist der Testcode:

public class MainActivity extends Activity implements OnClickListener { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     this.setTitle("MainActivity"); 

     ((Button) findViewById(R.id.btnChildActivity)).setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     startActivity(new Intent(this, ChildActivity.class)); 
    } 

} 

public class ChildActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main2); 
     this.setTitle("ChildActivity"); 

    } 
} 
+0

Ihr Beispiel lief einfach ohne Probleme. Die Reihenfolge, die ich gemacht habe: starte die App (jetzt auf dem MainActivity-Bildschirm), drücke die Taste (ChildActivity startet), drücke die Home-Taste (jetzt auf dem Home-Bildschirm), langpress home und wähle MainActivity (bei ChildActivity), drücke zurück (Ende bei MainActivity) – sooniln

+1

Ok. das erwarte ich auch. Aber was ist mit dem Ausführen der Anwendung vom Startbildschirm aus? (Ich gehe nicht aus dem Menü der letzten Anwendung, wenn Sie die Home-Taste lange drücken, aber vom Home-Bildschirm aus) Ich erwarte meine ChildActivity. Jedoch; Die MainActivity wird gestartet. Vielen Dank. –

+0

Entschuldigung, immer noch das gleiche Ergebnis :(Drücken Sie die App-Taste auf der Startseite (auf MainActivity), drücken Sie die Taste (bei ChildActivity), drücken Sie Home (auf dem Home-Bildschirm), drücken Sie die App-Taste auf der Startseite (auf ChildActivity), drücken Sie zurück Wollen Sie, dass Ihre App immer auf dem ChildActivity-Bildschirm startet? – sooniln

Antwort

3

EDIT: Fand die Lösung für Ihr Problem etwas zufällig heute! Siehe hierzu error report. Es erklärt dein Problem genau. Der Grund, warum ich das Problem nicht reproduzieren konnte, ist, dass ich Eclipse niemals direkt eine App starten lasse. Ich benutze Eclipse, um die App zu installieren und starte sie dann selbst.


Dies ist bereits das Standardverhalten für Android-Anwendungen, es sind keine speziellen Tricks erforderlich, um dies zu erreichen. Ich bin überrascht, dass Ihre Anwendung dieses Verhalten nicht demonstriert. Jede Android-Anwendung verwaltet einen Aktivitätsstapel, buchstäblich einen LIFO-Stapel von Aktivitäten. Diese Aktivitäten können weiter in Aufgaben gruppiert werden, aber 99% der banalen Apps werden meiner Erfahrung nach nie etwas über Aufgaben wissen müssen.

Wenn Sie die Home-Taste drücken, wird der gesamte Anwendungsstapel in den Hintergrund versetzt. Während im Hintergrund kann es für Speicherprobleme jederzeit getötet werden, aber wenn nicht viel Zeit vergeht, bevor es wiederhergestellt wird, wird es im Allgemeinen nicht getötet und muss nicht neu erstellt werden. Wenn Sie die Anwendung erneut auswählen, wird der Stapel (oder genauer gesagt, nur das oberste Element auf dem Stapel) wiederhergestellt.

Wenn Ihre Anwendung dieses Verhalten nicht aufweist, vermute ich, dass es etwas damit zu tun hat, wie Sie die mainActivity und childActivity und alle zusätzlichen Intent-Flags starten, die Sie möglicherweise verwenden. Gibt es eine Chance, dass Sie Code-Snippets darüber schreiben können, wie Sie mainActivity und childActivity starten?

+0

Sie haben Recht.Nachdem ich meine Test-Anwendung unterschrieben und installieren Sie es auf G1 und ausführen, sah ich das richtige Verhalten, das ich erwarten zu sehen. Das nächste, was ich tun werde, ist, meinen Code von speichern/status wiederherstellen und auf meinem Gerät erneut ausführen Vielen Dank für Ihre Hilfe :) –

+0

Soonil, ich möchte Sie nicht verwandten Frage fragen. Verwenden Sie automatisiertes Skript zum Erstellen und Exportieren Ihrer Anwendung? Wenn ja, wie machst du das? Ich konnte den export speziell für Android nicht herausfinden. Vielen Dank. –

+0

Ich habe darüber nachgedacht, ANT zu verwenden, um mit zu bauen, aber im Moment macht Eclipse alles, was ich brauche. Ich benutze nur ein paar Skripte, um das Signieren einer App ein bisschen einfacher zu machen. Sie finden eine ziemlich gute Erklärung für einen vereinfachten Veröffentlichungsprozess unter http://developer.android.com/guide/publishing/app-signing.html – sooniln

-1

Ich ging zurück und getestet mit einer ähnlichen Anwendung, und selbst wenn der Prozess aus dem Speicher gezwungen wird, wird ChildActivity automatisch wiederhergestellt, wie Soonil sagt. Siehst du das auf dem Emulator oder auf einem tatsächlichen Gerät?

Wenn Sie Ihre Anwendung ausführen und beobachten logcat, sollten Sie so etwas wie die folgende sehen, nachdem Sie Ihre App starten, dann die ChildActivity öffnen und Start klicken und dann Ihre Aktivitäten starten wieder:

Ausgangsaktivität: Intent {Aktion = android.intent.action.MAIN categories = {android.intent.categroy.LAUNCHER} Flags = ... comp = {com.yourpackagename.MainActivity}} Starten Sie proc für die Aktivität yourpackagename.ChildActivity: pid = x uid = y gids = {} Angezeigte Aktivität /.ChildActivity

Könnten Sie die Ausgabe von logcat veröffentlichen, wenn Sie das erwartete Verhalten nicht sehen?

+0

AFAIK das ist ungenau. Wenn ein Prozess beendet wird und die Aktivitäten neu gestartet werden, wird der Aktivitätenstapel gespeichert. Jede Aktivität muss Informationen nur über ihren eigenen Status serialisieren. Der Status des gesamten Aktivitätsstapels wird vom System verwaltet. (Ich werde meinen Downvote entfernen, wenn Sie mich mit dem Beweis verbinden können) – sooniln