tutorial studio screensize rotate programacion how español configchanges change android android-activity ondestroy

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!