2010-08-04 7 views
19

Información: Mi dispositivo es un Nexus One con 2.2 y he probado dos proyectos, uno en 1.5 y uno en 2.1.Problemas para comprender el ciclo de vida cuando la pantalla se apaga y en

Problema: Tengo problemas para comprender el ciclo de vida de mi aplicación cuando la pantalla está apagada y encendida.

Aquí está mi salida

// 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 ... 

estoy totalmente confundido. ¿Por qué reiniciar la actividad cuando la pantalla se apaga? ¿Y por qué parar y volver a iniciarlo cuando la pantalla ya estaba encendida y solo se quitó el bloqueo?

Para asegurarme de no haber hecho nada incorrecto, creé un nuevo proyecto con solo esta actividad. El resultado es idéntico ...

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 ..."); 
    } 
} 

¿Alguien tiene una idea?

actualización a partir de hoy (no entiendo por qué no se comporta como la última vez, tal vez más recursos libres?)

// 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

Lo que es extraño es que veo OnDestroy (onStart),(), llamadas onResume(), pero no veo ninguna onCreate() llama. También estoy interesado en comprender el comportamiento. –

+0

Eso es porque mi onCreate perdió la declaración de registro ... También he probado hoy de nuevo ... ahora mi juego tiene el mismo comportamiento, pero el TestProject tiene el comportamiento esperado (véase la actualización) – WarrenFaith

Respuesta

-2

Ver Activity Lifecycle documentación para una buena descripción del ciclo de vida, con los diagramas.

Lo más probable es que su actividad muera con la pantalla apagada para ahorrar recursos (carga de la batería). Como dice la documentación, básicamente se te puede matar en cualquier momento que Android quiera liberar recursos. Por lo tanto, siempre debe diseñar sus actividades para poder detenerlas y reiniciarlas en cualquier momento.

+1

Sé que la documentación del ciclo de vida. La muerte para ahorrar recursos no puede ser la razón porque se reinicia inmediatamente. Y ese es exactamente mi problema. No entiendo por qué se mata e inmediatamente se reinicia. que almacenar una gran cantidad de la base de datos cuando se activa la OnDestroy() ... La aplicación innecesaria destruye resultados en tiempos responde las largas ... – WarrenFaith

+0

veo ... En realidad no he probado esta teoría, pero la documentación se describen algunas configChanges: http://developer.android.com/reference/android/R.attr.html#config Cambios que hacen que la aplicación se reinicie. Es posible que encender y apagar la pantalla se ajuste a uiMode? De todos modos, es posible que desee ver si puede hacer que enDestroy sea más eficiente. Tal vez guardar estado en todo, por lo que hay menos para guardar en ese momento? –

0

Ese es el camino. Si lees el ciclo de vida de la actividad, verás que los pasos están ordenados de esa manera. No es solo cuando la pantalla se enciende y se apaga, sino también cuando se acelera el mantenimiento del teléfono. Android recreó la actividad siguiendo exactamente los pasos que mencionaste anteriormente. Intenta girar la pantalla, ¡ya verás! =)

+0

Creo que su predacament es muy similar a la situación que he mencionado anteriormente. Tiene que tener algo con las vistas que se cambian para que la actividad se mate y se vuelva a crear para que funcione sin pantalla. Es solo mi suposición ... – Shouvik

30

Tuve el mismo problema con mi propio juego. Mi juego solo funciona en modo horizontal, y cuando se apaga la pantalla, el protector de pantalla android toma el control (en modo retrato), enviando así un cambio de orientación que destruye y recrea la actividad.

Una solución sencilla es declarar que va a dirigirse a sí mismo de orientación pantalla cambia:

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

Esto es bastante fácil si su actividad está declarado como único paisaje (que tiene que hacer nada), pero puede llegar más difícil si su actividad puede girar ...

+0

¡Gracias! Me hubiese llevado algún tiempo encontrarlo. Puede confirmar qué es Happing con la aplicación de paisaje: recreado una vez para cambiar a retrato, recreado 2ª vez después de volver de la pantalla apagada. También funciona lo de configChanges. Esto realmente debería documentarse adecuadamente (de manera prominente). – oberstet

+3

Esto probablemente debería diseñarse como la respuesta aceptada, ya que aunque llegó un mes después, identifica la causa de lo que quedó misterioso en el otro. –

+0

¿Alguien sabe * cómo * detectar dicho ciclo de vida? Me refiero a detectar que se llama a OnStop solo porque la pantalla se está apagando y que onStart se ejecutará pronto. – Snicolas

4

Ruben's answer es completamente correcto, pero solo si su aplicación apunta al nivel API 12 o inferior.

Pero dado que el nivel de la API 13, además de la opción orientation, usted tiene que declarar la opción screenSize, ya que también se activa cuando un dispositivo se cambia entre el retrato y las orientaciones del paisaje:

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

lo contrario , su actividad se volvería a crear un tiempo adicional cuando la pantalla se apaga en la API 13 o en una plataforma superior.

Para referencia, vea API docs, android:configChanges notas de sección.

Cuestiones relacionadas