2010-04-22 14 views
8

Tengo una aplicación que comienza a reproducir sonidos y comienza/reanuda el juego en el método onResume(), pero lo que noto es que si mi aplicación fue la última en ejecutar cuando puse el teléfono en modo de espera (pantalla apagada), y solo presiono el botón de Menú para verificar la hora, luego el teléfono comienza a jugar y suena en segundo plano (la aplicación no está realmente visible, solo aparece la pantalla con la fecha/hora, sin embargo, debe haber sido invocado el mi aplicación). ¿Qué debo hacer aquí? ¿Hay alguna manera de discernir qué está reactivando la aplicación y luego agregar una declaración condicional que solo comienza el juego cuando la aplicación está realmente visible?Android - ¿Cómo manejar adecuadamente los métodos onPause/onResume?

Aquí hay un fragmento de mi onResume:

@Override 
    protected void onResume() 
    { 
     mySaveGame = Utilities.loadSavegame(this); 

     //check the savegame 
     if(mySaveGame!=null) 
     { 
      //start game using savegame values 
      this.startFromSavedGame(mySaveGame.getIsLevelComplete()); 
     } 
     else 
     { 
      //run the 1st-run components 
      this.startFirstRun(); 
     } 

     super.onResume(); 
    } 

La única cosa que puedo pensar en hacer para evitar que el juego se inicie siempre que la pantalla se excita (incluso cuando la aplicación no es visible) es para poner this.finish() como la última línea en onPause() ... pero eso te obliga a reiniciar la aplicación cada vez que quieras volver a ella porque el preceso mismo fue eliminado (lo cual está bien porque mi onPause guarda persistente datos, pero no es una solución elegante).

Por favor ayuda.

Respuesta

8

¿Ha considerado cambiar a onStart() y onStop(), en lugar de onResume() y onPause()?

+0

Gracias por responder. He probado onStart()/onStop(), pero obtengo los mismos resultados ... el juego se reproduce en segundo plano, incluso cuando no está realmente visible. De acuerdo con la documentación, onStart() se llama beforeResume() (así que es por eso que no funciona en mi caso) y onStop() "nunca se puede llamar ..." – RyanM

+0

Hmmmm ... Eso suena como el bloqueo la pantalla no se considera correctamente como tener el primer plano. ¿En qué dispositivo estás probando esto? – CommonsWare

+0

Estoy usando un T-Mobile G1 (firmware de Android 1.6). – RyanM

4

Estaba teniendo el mismo problema (tuve mi reproductor de música reanudar/pausa en onResume()/onPause()) y la mejor solución que encontré es pausar y reanudar mi actividad cuando está en primer plano que puede obtener con public void onWindowFocusChanged (boolean hasFocus) devolución de llamada.

Editar: Esta en una antigua y ligeramente incorrecta respuesta - respuesta correcta se describe en el blog de desarrolladores de Android: making android games that play nice

+1

¿Notó que en algunos dispositivos se invoca aWidowFocusChanged con hasFocus == falso cuando cambia el volumen? – Gallal

+0

Desde mi publicación, Google ha proporcionado una mejor alternativa que trata ese problema correctamente en todos los dispositivos/firmwares, he editado mi publicación original anterior. – MichalisB

Cuestiones relacionadas