android - studio - ¿Cómo distinguir si onDestroy() se llama como parte de la secuencia de cambio de configuración?
manual de programacion android pdf (3)
En Android 3.x (API nivel 11), puede llamar a isChangingConfigurations()
para ver si la actividad se está destruyendo debido a un cambio de configuración.
Antes de eso, reemplaza en onRetainNonConfigurationInstance()
y establece un miembro de datos booleanos (por ejemplo, isChangingConfigurations
) en true
y verifica ese miembro de datos en onDestroy()
.
En mi actividad, algo externo (servicio) necesita ser destruido en onDestroy (). Pero no quiero esto cuando ocurre un cambio de configuración (por ejemplo, el teclado se desconecta) porque se restaurará de inmediato.
Entonces, la pregunta es: ¿cómo distinguir si onDestroy () es causado por, por ejemplo, presionar la tecla Atrás o parte del proceso de cambio de configuración?
después de la respuesta de @ CommonsWare sería bastante simple) algo así como:
@Override
onDestroy() {
if (mIsChangeConfig == true) {
mIsChangeConfig = false:
} else {
stopService();
}
}
@Override
onRetainNonConfigurationInstance() {
mIsChangeConfig = true;
}
Tengo una solución para los casos en que algo X debe hacerse en onStop (), pero no desea que se realice si hay un cambio de configuración (y obviamente no tiene disponible isChangingConfigurations ()).
La técnica consiste en realizar esta acción X en un AsyncTask y retrasado. Llama a AsyncTask en onStop () / onPause () y en ontaetaCustomNonConfigurationInstance () cancela la tarea. De esta forma, si el usuario presiona la tecla de inicio, por ejemplo, el código X se ejecutará en segundo plano. Sin embargo, si hay una rotación de pantalla, el código X no se ejecutará porque la tarea se cancelará antes de que se ejecute (ese es el significado de la demora).
Lo estoy usando, por ejemplo, para resolver problemas con wakelocks: soltándolos en onPause () pero no si el usuario cambia la orientación de la pantalla.
Aquí está mi código:
private class ReleaseWakeLockDelayedTask extends AsyncTask<WakeLock, Integer, Integer>{
@Override
protected Integer doInBackground(WakeLock... params) {
try {
// Delay so that onRetainCustomNonConfigurationInstance is in
// time of cancelling the task
Thread.sleep(5000);
} catch (InterruptedException e) {}
if(isCancelled()) return null;
releaseWakeLock(params[0]); // own method that calls the actual release
return null;
}
}
@Override
public Object onRetainCustomNonConfigurationInstance() {
...
if(mReleaseWakeLockTask != null && mReleaseWakeLockTask .getStatus() != AsyncTask.Status.FINISHED){
mReleaseWakeLockTask.cancel(true));
}
...
}
@Override
protected void onPause() {
// create and call the task
boolean wRun;
if(mReleaseWakeLockTask != null){
if(mReleaseWakeLockTask .getStatus() != AsyncTask.Status.FINISHED) wRun= false;
else wRun= true;
}else wRun = true;
if(wRun){
mReleaseWakeLockTask = new mReleaseWakeLockTask ();
mReleaseWakeLockTask .execute(wakeLock);
}
}
¡Espero eso ayude!
Esto puede ser el truco para ti (de Cómo distinguir entre cambio de orientación y dejar aplicación Android ):
Use el método isFinishing () de la actividad.
Código de muestra:
@Override
protected void onDestroy() {
super.onDestroy();
if (isFinishing()) {
// Do stuff
} else {
// It''s an orientation change.
}
}