OnPause / onResume problemas de actividad
Tengo una pequeña aplicación de prueba en la que estoy trabajando, que tiene un temporizador que actualiza un textview 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 de atrás en el teléfono y luego Reinicie el temporizador desde donde lo dejaron cuando vuelven a abrir la aplicación. Aquí está el código que estoy usando:
@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 el textview en el método onTick y actualiza la variable int this._timer_time_remaining.
- Android no puede crear el controlador dentro del subproceso que no ha llamado looper.prepare ()
- No recibe datos de ubicación del hilo
- ¿Cómo puedo implementar un Timer / TimerTask que ejecuta un AsyncTask? (Androide)
- Fiabilidad del método postDelay de Android
- ¿Cómo cambiar el retraso del hilo de sueño / temporizador en android durante el tiempo de ejecución?
CountDownTimer y _timer_time_remaining se declaran en el nivel de clase de la siguiente manera:
private CountDownTimer timer; private int _timer_time_remaining;
Desde las impresiones Log.v () veo que la variable _timer_time_remaining tiene el número correcto de segundos almacenados cuando onPause se llama, pero se pone de nuevo a 0 cuando onResume se inicia. ¿Por qué se restablece la variable? Pensé que la aplicación continuaría funcionando en el fondo con los mismos valores. ¿Me estoy perdiendo de algo? Todo esto se declara en una clase que extiende Actividad.
¡Gracias por adelantado!
Nota: Editado para limpiar la copia del código
- Android: EditText pierde foco cuando se llama a setText
- Inicie el temporizador al hacer clic en el botón
- Temporizador () como Daemon Vs non Daemon
- Java cronometrar, System.nanoTime () batear que System.currentTimeMillis () pero persiste sobre sueño?
- Cambiar horario scheduleAtFixedRate
- Pausa CountDownTimer en Android cuando la actividad no está en frente
- ¿Cómo hacer un temporizador simple sin nueva clase en Android?
- Temporizador en segundo plano
Si echa un vistazo al diagrama del ciclo de vida de la actividad, se dará cuenta de que no hay garantías sobre usted. Actividad después de que se llame OnPause. Android podría matarte Actividad sin siquiera llamar a onDestroy. Tienes que guardar tu estado usando onSaveInstanceState y restaurarlo usando onRestoreInstanceState .
Esto podría ser útil.
EDITAR:
El ciclo de vida cubre diferentes escenarios. Si sólo tiene una actividad, presionar Atrás es equivalente a salir de su aplicación. Si tiene Actividad A que inicia la actividad B entonces onSaveInstanceState se llama para la Actividad A. Al pulsar de nuevo en la Actividad B acaba de salir y onRestoreInstanceState se llama para la Actividad A. Está intentando guardar datos entre dos ejecuciones distintas de su aplicación y usted Necesidad de utilizar algún tipo de almacenamiento persistente para esto.
Así es como guardaría 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();
En el curriculum vitae, haga esto: (Dos líneas de código)
SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE); int time_remaining = example.getInt("time_remaining", 0);
He adaptado esto de algunos de mi código de trabajo, pero en realidad no lo prueba en este formato exacto. Busque la documentación de SharedPreferences para saber cómo funciona.
No soy un experto en Android, pero sólo digo de cómo espero que el temporizador se comporte
this.timer.cancel()
: – cancelaría el temporizador, pero no lo this.timer.cancel()
start_timer(this._timer_time_remaining)
: – podría "reiniciar" el temporizador, no continuar desde la última posición.
Así que lo que ves es correcto. Cada vez que se empieza de nuevo. Averigüe cuál es la api para pausar el temporizador (si existe).
Simplemente puede escribir el tiempo de espera en una base de datos o un archivo en onPause y volver a leerlo en onResume.
También puede intentar escuchar las pulsaciones de teclas (onKeyDown ()) para interceptar el botón de retroceso y guardar sus datos en una tabla SQLite.
- Android: Cajón de navegación SubMenu: Cómo elementos de navegación plegables
- Android – La barra de calificación personalizada se parece a su sangrado