Activity Stack / Lifecycle Problem

  • Hey folks,


    ich habe ein Problem eine Activity zu destroyen die gerade nicht sichtbar ist und in onStop() wartet.
    Ich habe bisher nur 2 Activities, den Rest erledige ich mit Fragementen und ist in diesem Fall nicht von Bedeutung.
    Auf dem Bild habe ich versucht zu veranschaulichen wie meine Activities verbunden sind.


    In der onStop() von Login befindet sich ein finish() Aufruf sodass diese destroyed wird sobald sie nicht mehr sichtbar ist.
    Ich waähle im ersten Schritt eine Maschine aus mit der ich mich verbinden möchte. Ist diese erreichbar wird die MainActivity gestartet und die Login logischerweise destroyed.
    In meiner MainActivity kann ich nun munter vor mich hin arbeiten, bis ich auf die Idee komme ich könnte mich nun mit einer anderen Maschine verbinden. Also rufe ich das OptionsMenu auf und wähle "Verbindungen", dies startet wieder die Login Activity.


    Ab hier gibt es zwei Fälle die ich berücksichtigen muss !!
    [Blockierte Grafik: http://i.slick.pics/FUCkxF6HW.png]
    Fall 1: der User befindet sich wie dargestellt in der LoginActivity ganz rechts und die MainActivity dümpelt wartend in der onStop() herum. Nun fällt dem User ein das er sich gar nicht zu einer anderen Maschine verbinden möchte und benutzt den BackButton um zurück zur Main Activity zu kommen. Das funktioniert wunderbar, da die MainActivity nicht destroyed wurde.


    Fall 2: der User verbindet sich mit einer anderen Maschine, daraufhin wird ein neues Objekt der MainActivity erzeugt und gestartet, ( nun sollte ich eigentlich irgendwie die vorherige Main Activity, die in onStop() wartet, destroyen [ das ist genau das Problem das ich nicht hin bekomme ] ) nach dem start wird wie üblich die Login Activity destroyed.


    Ich kann nun ganz normal mit meiner MainActivity(2) arbeiten. Führe ich das Spiel aus "Fall 2" mehrfach durch habe ich immer mehr MainActivities, und wenn ich den BackButton benutze wird die aktuell sichtbare destroyed und ich komme in die vorherige zurück, dann wieder destroyen und in die vorherige zurück, .....bis alle gekillt wurden.


    Ich hoffe ich konnte mein Problem verständlich schildern.


    LG proto

  • Möglichkeit 1:
    Du änderst den Workflow. Umentscheiden is nich drin, wer sich mit einer anderen Maschine verbinden will, wird von der aktuellen Maschine abgemeldet.
    Wenn dies ein definiertes Verhalten ist, kommt der Nutzer damit klar. (Er wird sich stumpf daran gewöhnen, dass die App auf den 'Zurück' Button mit Beenden reagiert.)


    Möglichkeit 2:
    Activity Login hat eine Instanzvariable/Member, beispielsweise private MainActivity callingActivity = null; mit dazugehörigem Setter.
    Beim ersten Start der App ist diese Variable null, bei jedem weiteren Erzeugen der LoginActivity setzt Du diese Variable auf den Wert der aktuellen MainActivity.


    Dann kannst Du im onClickListener() des Login Buttons Deiner LoginActivity die aufrufende MainActivity sauber beenden:

    Java
    […]
    if( callingActivity != null ) {
      callingActivity.finish();
    }
    […]


    (Oder erst in der Methode, die anzeigt, dass die Verbindung möglich ist.)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Habe mich dafür entschieden... Hier schon mal ein Danke an dich :thumbup:


    Möglichkeit 2:
    Activity Login hat eine Instanzvariable/Member, beispielsweise private MainActivity callingActivity = null; mit dazugehörigem Setter.
    Beim ersten Start der App ist diese Variable null, bei jedem weiteren Erzeugen der LoginActivity setzt Du diese Variable auf den Wert der aktuellen MainActivity.


    Der setter für die Variable ist angelegt, nur weiss ich nicht wie ich dran kommen soll... hier der Aufruf der LoginActivity...

    Java
    Intent intent = new Intent(this, Login.class);
          Bundle b = new Bundle();
          b.putInt("options", 777);   //Your id
          intent.putExtras(b);      //Put your id to your Intent
          startActivity(intent);

    Ich habe kein wirkliches Objekt von Login, und wenn ich ein Objekt mache, weiss ich nicht wie ich ein Intent davon mache um die Activity zu starten...

  • Ach, verdammt. Verwechselt. Häng grad zu tief in iOS drin… :(


    Folgender Ansatz:

    Java: MainActivity.java
    […]
    public static Activity handleToClose = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
      […]
      handleToClose = this;
    }


    Java: InfoActivity.java
    […]
    @Override
    public void onClick(View v) {
      […]
      MainActivity.handleToClose.finish();
    }

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

    2 Mal editiert, zuletzt von Marco Feltmann ()

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!