2010-08-04 5 views
19

Information: Mein Gerät ist ein Nexus One mit 2.2 und ich habe zwei Projekte getestet, eins auf 1.5 und eins auf 2.1.Probleme, die den Lebenszyklus zu verstehen, wenn der Bildschirm aus- und wieder eingeschaltet

Problem: Ich habe Probleme, den Lebenszyklus meiner Anwendung zu verstehen, wenn der Bildschirm aus- und eingeschaltet wird.

Hier ist mein Ausgang

// activity starts 
08-04 17:24:17.643: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:24:17.643: ERROR/PlayActivity(6215): onResume executes ... 
// screen goes off 
08-04 17:24:28.943: ERROR/PlayActivity(6215): onPause executes ... 
08-04 17:24:32.113: ERROR/PlayActivity(6215): onStop executes ... 
08-04 17:24:32.113: ERROR/PlayActivity(6215): onDestroy executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onResume executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onPause executes ... 
// screen goes on 
08-04 17:24:47.683: ERROR/PlayActivity(6215): onResume executes ... 
// lock removed 
08-04 17:24:56.943: ERROR/PlayActivity(6215): onPause executes ... 
08-04 17:24:59.663: ERROR/PlayActivity(6215): onStop executes ... 
08-04 17:24:59.663: ERROR/PlayActivity(6215): onDestroy executes ... 
08-04 17:25:00.943: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:25:00.943: ERROR/PlayActivity(6215): onResume executes ... 

ich total verwirrt bin. Warum muss die Aktivität neu gestartet werden, wenn der Bildschirm ausgeschaltet wird? Und warum stoppen und neu starten, wenn der Bildschirm bereits eingeschaltet war und nur die Sperre entfernt wurde?

Um sicherzustellen, dass ich nichts falsch gemacht habe, habe ich ein neues Projekt mit nur dieser Aktivität erstellt. Der Ausgang ist identisch ...

public class LifeCycleTest extends Activity { 

    private final static String DEBUG_TAG = "FirstLifeLog"; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.e(DEBUG_TAG, "onCreate executes ..."); 
     setContentView(R.layout.main); 
    } 

    protected void onRestart() { 
     super.onRestart(); 
     Log.e(DEBUG_TAG, "onRestart executes ..."); 
    } 

    protected void onStart() { 
     super.onStart(); 
     Log.e(DEBUG_TAG, "onStart executes ..."); 
    } 

    protected void onResume() { 
     super.onResume(); 
     Log.e(DEBUG_TAG, "onResume executes ..."); 
    } 

    protected void onPause() { 
     super.onPause(); 
     Log.e(DEBUG_TAG, "onPause executes ..."); 
    } 

    protected void onStop() { 
     super.onStop(); 
     Log.e(DEBUG_TAG, "onStop executes ..."); 
    } 

    protected void onDestroy() { 
     super.onDestroy(); 
     Log.e(DEBUG_TAG, "onDestroy executes ..."); 
    } 
} 

Hat jemand eine Idee?

Update von heute (nicht verstehen, warum es nicht das letzte Mal wie verhält sich, vielleicht auch mehr freie Ressourcen?)

// activity starts 
08-09 12:14:03.122: ERROR/FirstLifeLog(15406): onCreate executes ... 
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onStart executes ... 
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onResume executes ... 
// screen off 
08-09 12:14:07.412: ERROR/FirstLifeLog(15406): onPause executes ... 
// screen on 
08-09 12:14:11.722: ERROR/FirstLifeLog(15406): onResume executes ... 
// no log for removed screen lock 
+0

Was ist seltsam ist, dass ich onDestroy(), onStart(), OnResume() -Aufrufe sehe, aber ich sehe keine onCreate() -Aufrufe. Ich bin auch daran interessiert, das Verhalten zu verstehen. –

+0

Das liegt daran, dass mein onCreate die Log-Anweisung verpasst ... Auch habe ich es heute nochmal ausprobiert ... jetzt hat mein Spiel das gleiche Verhalten, aber das Testprojekt hat das erwartete Verhalten (siehe Update) – WarrenFaith

Antwort

-2

Siehe Activity Lifecycle Dokumentation für eine gute Beschreibung des Lebenszyklus, mit Diagrammen.

Wahrscheinlich ist Ihre Aktivität beendet, wenn der Bildschirm ausgeschaltet wird, um Ressourcen zu sparen (Batteriestrom). Wie die Dokumentation sagt, können Sie grundsätzlich jederzeit getötet werden, wenn Android Ressourcen freigeben möchte. Daher sollten Sie Ihre Aktivitäten immer so gestalten, dass sie jederzeit gestoppt und neu gestartet werden können.

+1

Ich kenne die Lifecycle-Dokumentation. Der Kill zum Speichern von Ressourcen kann nicht der Grund sein, da er sofort neu gestartet wird. Und genau das ist mein Problem. Ich verstehe nicht, warum es getötet und sofort neu gestartet wird. Ich speichere viel in der Datenbank, wenn die onDestroy() ausgelöst wird ... Die unnötige App zerstört Ergebnisse in langen Antwortzeiten ... – WarrenFaith

+0

Ich sehe ... Ich habe diese Theorie nicht wirklich getestet, aber die Dokumentation diskutiert einige configChanges: http://developer.android.com/reference/android/R.attr.html#configÄnderungen, die zum Neustart der App führen. Ist es möglich, dass das Ein- und Ausschalten des Bildschirms unter uiMode erfolgt? Unabhängig davon möchten Sie vielleicht sehen, ob Sie onDestroy effizienter machen können. Vielleicht den ganzen Staat retten, so dass es an diesem Punkt weniger zu retten gibt? –

0

Das ist der Weg. Wenn Sie den Aktivitätslebenszyklus lesen, werden Sie sehen, dass die Schritte so ziemlich geordnet sind. Es ist nicht nur, wenn Ihr Bildschirm ein- und ausschaltet, sondern auch, wenn Sie das Telefon eingeben. Android hat die Aktivität genau nach den oben genannten Schritten neu erstellt. Versuchen Sie, Ihren Bildschirm zu drehen, Sie werden dann sehen! =)

+0

Ich denke, Ihr Vordatierung ist sehr ähnlich zu der Situation, die ich oben erwähnt habe. Es muss etwas mit den Ansichten haben, die geändert werden, also wird die Aktivität getötet und neu erstellt, um ohne Bildschirm zu laufen! Es ist nur meine Vermutung ... – Shouvik

30

Ich hatte das gleiche Problem mit meinem eigenen Spiel. Mein Spiel funktioniert nur im Querformat, und wenn der Bildschirm ausgeschaltet wird, übernimmt der Android-Bildschirmschoner das Steuerelement (im Hochformat) und sendet so einen orientationChange, der die Aktivität zerstört und neu erstellt.

Eine einfache Lösung ist zu erklären, dass Sie sich die Bildschirmausrichtung ändert verwalten:

<activity ... android:configChanges="orientation" ... > 

Das ist ganz einfach, wenn Sie Ihre Aktivität Landschaft deklariert wird nur zu sein (man nichts zu tun hat), kann aber erhalten schwieriger, wenn Ihre Aktivität rotieren kann ...

+0

Danke! Hätte mich wohl etwas Zeit genommen, das herauszufinden. Kann bestätigen, was mit Landschafts-App happing: einmal erstellt für den Wechsel in das Porträt, neu erstellt 2. Mal nach dem Zurückkommen vom Bildschirm aus. Auch das configChanges-Zeug funktioniert. Dies sollte wirklich (prominent) dokumentiert werden. – oberstet

+3

Dies sollte wahrscheinlich als die akzeptierte Antwort entworfen werden, denn obwohl es einen Monat später kam, identifiziert es die Ursache dessen, was in dem anderen mysteriös geblieben war. –

+0

Weiß jemand * wie * einen solchen Lebenszyklus zu erkennen? Ich meine, dass onStop aufgerufen wird, nur weil der Bildschirm ausgeht und onStart bald ausgeführt wird. – Snicolas

4

Ruben's answer ist vollständig korrekt, aber nur, wenn Ihre Anwendung die API-Ebene 12 oder niedriger zielt.

Aber da die API-Ebene 13 neben die orientation Option haben Sie die screenSize Option zu erklären, denn es wird auch ausgelöst, wenn ein Gerät schaltet zwischen der Hoch- und dem Querformat:

<activity ... android:configChanges="orientation|screenSize" ... > 

Andernfalls , Ihre Aktivität würde immer noch eine zusätzliche Zeit neu erstellt werden, wenn Bildschirm auf der API 13 oder einer höheren Plattform ausgeht.

Als Referenz siehe API docs, android:configChanges Abschnitt Hinweise.

Verwandte Themen