2017-07-18 8 views
0

Also, ich bin ein bisschen ein neues Android-Entwickler, aber ich mache Fortschritte. Ich habe eine MainActivity, was ich zu booten, und dann eine Reihe von Unteraktivitäten, um etwas Arbeit zu tun.Android zurück von Aktivität

Ich arbeite zZ, um jene Untertätigkeiten heraus zu erhalten und zu MainActivity zurückzugehen, um zu vermeiden, für immer auf irgendeinem gelegentlichen Fenster zu sitzen. Es ist eine Art von Kiosk Art von App, an der ich arbeite, daher ist die Rückkehr zu MainActivity eine Voraussetzung.

Ich konnte dies mit einer Handler and Runnable() in meiner Unter-Aktivitätsklasse arbeiten. Wenn ich folgendes mache, wenn der Handler das Zeitlimit überschreitet und Runnable.run() aufgerufen wird, funktioniert das irgendwie.

Intent intent = new Intent(LightsActivity.this, MainActivity.class); 
startActivity(intent); 

Dies verursacht jedoch MainActivity onCreate erneut auszuführen. Da MainActivity bereits im Hintergrund ausgeführt wird, möchte ich zu dieser Instanz zurückkehren, anstatt eine neue zu starten.

Was ich denke, ich möchte finish() in der Runnable aufrufen und es die Aktivität schließen und zurück zu Main. Das funktioniert nicht richtig. Ich sehe MainActivity onStart() läuft, und nicht onCreate(), was ich will.

Was auf dem Bildschirm angezeigt wird, ist jedoch das LightsActivity-Design-Layout, aber ohne die LightsActivity Klasse tatsächlich ausgeführt wird. Ich habe einige Timer in LightsActivity.onCreate() erstellt, die Felder jede Sekunde aktualisieren, wenn es ausgeführt wird, aber diese funktionieren nicht mehr, nachdem ich finish() (wieder, erwartet) aufrufen. Was ist der Trick, um eine Aktivitätsklasse zu stoppen und die Benutzeroberfläche wieder in das MainActivity-Fenster zu ändern?

Ich mache etwas falsch oder das ist ein Fehler. Alle Dokumente sagen finish() sollten tun, was ich will. Beachten Sie, dass das Aufrufen von LightsActivity.this.finish() auch nicht in Runnable funktioniert. Es handelt sich also nicht um ein Problem mit dem Umfang, das ich nicht denke.

Ich hoffe, jemand mit vielen Android-Erfahrung kann mir helfen.

public class MainActivity extends Activity { 
    private static final String TAG = MainActivity.class.getSimpleName(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d(TAG, "onCreate"); 
    } 

@Override 
    protected void onStart() { 
     super.onStart(); 
     Log.d(TAG, "onStart"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d(TAG, "onStop"); 
    } 

    public void viewLights(View view) { 
     Log.d(TAG, "Managing the lights"); 
     setContentView(R.layout.activity_lights); 
     startActivity(m_lights); 
    } 
} 

public class LightsActivity extends Activity { 
    private static final String TAG = LightsActivity.class.getSimpleName(); 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_lights); 
     handler.postDelayed(finalizer, 1000 * 10); 
     Log.d(TAG, "onCreate()"); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.d(TAG, "onStart"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d(TAG, "onStop"); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d(TAG, "onDestroy"); 
    } 

    Runnable finalizer = new Runnable() 
    { 
     public void run() 
     { 
      Log.d(TAG, "Activity timed out"); 
      finish(); 
     } 
    }; 
} 

Und ich bekomme folgende Ausgabe. Ich kann mit diesem einfachen Beispiel alle anderen Code auskommentieren.

07-19 13:20:37.761 1363-1363/? D/MainActivity: onCreate() 
07-19 13:20:37.767 1363-1363/? D/MainActivity: onStart 
07-19 13:21:20.280 1363-1363/com.home.pete.aquarium D/MainActivity: Managing the lights 
07-19 13:21:20.569 1363-1363/com.home.pete.aquarium D/LightsActivity: onCreate() 
07-19 13:21:20.571 1363-1363/com.home.pete.aquarium D/LightsActivity: onStart 
07-19 13:21:21.089 1363-1363/com.home.pete.aquarium D/MainActivity: onStop 
07-19 13:21:30.579 1363-1363/com.home.pete.aquarium D/LightsActivity: Activity timed out 
07-19 13:21:30.615 1363-1363/com.home.pete.aquarium D/MainActivity: onStart 
07-19 13:21:31.100 1363-1363/com.home.pete.aquarium D/LightsActivity: onStop 
07-19 13:21:31.100 1363-1363/com.home.pete.aquarium D/LightsActivity: onDestroy 

Der LightsActivity Bildschirm noch angezeigt wird, nicht die MainActivity.

+0

Sorry, ja, aber das hilft nicht. –

+0

Können Sie bitte einen [mcve] aller zugehörigen Codes erstellen? –

+0

Ich glaube nicht, dass ich hier ein komplettes Minimal, Complete und Verifizierbar posten kann. Der Code selbst, den ich schreiben kann, wird ohne viel Android Studio nicht funktionieren. Sie können jedoch die vollständige Quelle auf meiner https://github.com/buelowp/aquarium Seite sehen. Sie sollten das überprüfen und direkt erstellen können. –

Antwort

0

Was ich denke, ich möchte Finish() in der Runnable aufrufen und lassen Sie die Aktivität schließen und zurück zu Main. Das funktioniert nicht richtig. Ich sehe MainActivity onStart() läuft, und nicht onCreate(), was ich will.

Das funktioniert richtig. Überprüfen Sie die Activity Lifecycle.

  1. Sie starten MainActivity ->onCreate, onStart, onResume
  2. Sie starten LightsActivity ->onCreate, onStart, onResume
  3. Inzwischen MainActivity geht in den Hintergrund -> , onStop
  4. Fertig LightsActivity - > , onStop, onDestroy
  5. MainActivity ->onStart, onResume

Doch was auf dem Bildschirm zeigt das LightsActivity Design-Layout, aber ohne die LightsActivity Klasse tatsächlich ausgeführt wird. Ich habe einige Timer in LightsActivity.onCreate() erstellt, die Felder jede Sekunde aktualisieren, wenn es ausgeführt wird, aber diese funktionieren nicht mehr, nachdem ich finish() (wieder, erwartet) aufgerufen habe. Was ist der Trick, um eine Aktivitätsklasse anzuhalten und die Benutzeroberfläche wieder in das MainActivity-Fenster zu ändern?

Was Sie beschreiben, sollte funktionieren. Wenn nicht, hast du einen Fehler. Aber ohne Code, Screenshots, Stacktrace usw. kann niemand sagen, was Sie falsch machen. Setzen Sie Protokollierungsanweisungen in Ihre Lebenszyklusmethoden und Aufrufe auf finish, und führen Sie die Schritte durch.

UPDATE:

Nun, hier ist Ihr Problem:

public void viewLights(View view) { 
    Log.d(TAG, "Managing the lights"); 
    setContentView(R.layout.activity_lights); 
    startActivity(m_lights); 
} 

Dies sagt in MainActivity, wenn sie auf die ViewLightsActivity Navigation, zuerst an das Layout von activity_lights den Inhalt Ansicht verwenden (zwingende MainActivity des Layouts), navigieren Sie dann zu LightsActivity.

Wenn Sie also zur Aktivität zurückkehren, wird das neue Layout angezeigt, das Sie zuvor festgelegt haben. Entfernen Sie den Anruf mit setContentView in dieser Methode. Sie sollten immer nur setContentView in onCreate anrufen, es sei denn, Sie haben einen wirklich guten Grund.

+0

Ich stimme zu, sollte aber, aber ich postete ein abgespecktes Beispiel ohne anderen Code innerhalb, und es funktioniert immer noch nicht richtig. Ich frage mich, ob das ein Fehler in AT ist, aber ich kann niemanden finden, der sich darüber auf der Google+ Seite von AT beschwert, und diese Gruppe beschwert sich über eine Menge. –

+0

Sehen Sie meine aktualisierte Antwort, nachdem Sie Ihren Code gesehen haben. – dominicoder

+0

Super, danke. Ich habe das von einem Google Howto für Dinge eine Weile zurück. Ich sehe es jetzt, warum das keinen Sinn ergibt. –

Verwandte Themen