2010-03-14 16 views
14

Tengo una pequeña aplicación de prueba en la que estoy trabajando que tiene un temporizador que actualiza una vista de texto a la cuenta regresiva de 100 a 0. Eso funciona bien, pero ahora estoy tratando de pausar la aplicación si el usuario presiona el botón Atrás en el teléfono y luego reinicia el temporizador desde donde lo dejaron cuando vuelven a abrir la aplicación. Aquí está el código que estoy utilizando:onPause/onResume actividad problemas

@Override 
public void onPause() 
{ 
    if(this._timer_time_remaining > 0) { 
     this.timer.cancel(); 
    } 
    super.onPause(); 
    Log.v("Pausing", String.format("Pausing with %d", this._timer_time_remaining)); 
} 

@Override 
public void onResume() 
{ 
    Log.v("Resuming", String.format("Resuming with %d", this._timer_time_remaining)); 

    if(this._timer_time_remaining > 0) { 
     start_timer(this._timer_time_remaining); 
    } 
    super.onResume(); 
} 

El método start_timer() crea un countDownTimer que actualiza la Vista de Texto en el método onTick y actualiza la variable this._timer_time_remaining int.

countDownTimer y _timer_time_remaining se declararon tanto a nivel de clase como esta:

private CountDownTimer timer; 
private int _timer_time_remaining; 

Desde el Log.v() imprime veo que la variable _timer_time_remaining tiene el número correcto de segundos cuando se almacena onPause se llama, pero vuelve a 0 cuando se inicia OnResume. ¿Por qué se restablece la variable? Pensé que la aplicación continuaría ejecutándose en segundo plano con los mismos valores. ¿Me estoy perdiendo de algo? Todo esto se declara en una clase que amplía la Actividad.

¡Gracias de antemano!

Nota: Editado para limpiar el código copiado

Respuesta

16

Si se echa un vistazo en el diagrama para Activity lifecycle se dará cuenta de que no hay garantías acerca de que la actividad después de onPause se llama. Android podría matarte Actividad sin siquiera llamar a Destroy. Debe guardar su estado usando onSaveInstanceState y restaurarlo usando onRestoreInstanceState.

This puede ser útil.

EDIT:

del ciclo de vida abarca diferentes escenarios. Si solo tiene una Actividad, presionar Atrás equivale a salir de su aplicación. Si tiene la Actividad A que inicia la actividad B, se llama a OnSaveInstanceState para la Actividad A. Cuando presiona hacia atrás en la Actividad B, simplemente sale y onRestoreInstanceState se llama para la Actividad A. Está tratando de guardar datos entre dos ejecuciones distintas de su aplicación y usted Necesito usar algún tipo de persistent storage para esto.

+0

Primero, gracias por la respuesta. Reemplacé mi método onPause con el método onSaveInstanceState (Bundle savedInstancestate), pero parece que no se llama cuando presiono el botón Atrás para salir de mi aplicación. Ninguno de mis mensajes de LogCat aparece, así que no creo que se llame. ¿Necesito onPause y onSaveInstanceState implementado? ¿O debería onSaveInstanceState manejarlo? – Blather

+0

La documentación explica esto: "Un ejemplo de cuando se llama a OnPause() y onStop() y no a este método cuando un usuario regresa de la actividad B a la actividad A: no hay necesidad de invocar onSaveInstanceState (Bundle) en B porque una instancia particular nunca se restaurará, por lo que el sistema evita llamarlo ". Al presionar Atrás no se llama a SaveInstanceState, pero al presionar Home hace. –

+0

Gracias por responder. Vi eso mencionado, pero si onSaveInstanceState no se llama cuando se presiona el botón Atrás, no solucionará mi problema, ¿o sí? Solo quiero que el temporizador de cuenta regresiva se detenga cuando se presiona el botón Atrás y luego reiniciar desde la misma ubicación cuando la aplicación se inicia nuevamente desde la pantalla de inicio. Puedo estar malentendiendo, pero no parece que esto logre eso. Gracias de nuevo por el tiempo que ha dedicado a ayudar hasta ahora, creo que me falta algo aquí. – Blather

0

Simplemente puede escribir el tiempo de espera en una base de datos o archivo en onPause y leerlo en onResume.

1

No soy un experto en Android, pero sólo contando desde cómo espero que el temporizador comporte

this.timer.cancel(): - sería cancelar el temporizador, pero no hacer una pausa

start_timer(this._timer_time_remaining): - haría "reinicio "el temporizador, no continuar desde la última posición.

Entonces, lo que ves es correcto. Cada vez que el tiempo se inicia de nuevo. Averigua cuál es la API para pausar el temporizador (si corresponde).

0

También puede intentar escuchar las teclas presionadas (onKeyDown()) para interceptar el botón Atrás y guardar sus datos en una tabla SQLite.

2

Esto es cómo iba a guardar el valor: (Cuatro líneas de código)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE); 
SharedPreferences.Editor edit = example.edit(); 
edit.putInt("time_remaining", (Integer)this._timer_time_remaining); 
edit.commit(); 

El curriculum vitae, hacer esto: (Dos líneas de código)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE); 
int time_remaining = example.getInt("time_remaining", 0); 

Adapté esto desde algunos de mi código de trabajo, pero en realidad no lo probé en este formato exacto. Buscar documentación para sharedPreferences para aprender cómo funciona.

Cuestiones relacionadas