Realizar una pausa de actividad que no se reanuda después de volver a crear el método

Tengo un proyecto para HoneyComb y obtengo un error después del uso del método recreate () en el método onResum () en mi actividad principal.

11-10 22:05:42.090: E/ActivityThread(1917): Performing pause of activity that is not resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main} 11-10 22:05:42.090: E/ActivityThread(1917): java.lang.RuntimeException: Performing pause of activity that is not resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main} 11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2517) 11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2505) 11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2483) 11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.access$700(ActivityThread.java:122) 11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031) 11-10 22:05:42.090: E/ActivityThread(1917): at android.os.Handler.dispatchMessage(Handler.java:99) 11-10 22:05:42.090: E/ActivityThread(1917): at android.os.Looper.loop(Looper.java:132) 11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.main(ActivityThread.java:4123) 11-10 22:05:42.090: E/ActivityThread(1917): at java.lang.reflect.Method.invokeNative(Native Method) 11-10 22:05:42.090: E/ActivityThread(1917): at java.lang.reflect.Method.invoke(Method.java:491) 11-10 22:05:42.090: E/ActivityThread(1917): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 11-10 22:05:42.090: E/ActivityThread(1917): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 11-10 22:05:42.090: E/ActivityThread(1917): at dalvik.system.NativeStart.main(Native Method) 

Creo un nuevo proyecto para mostrarte lo que pasa.

Puede encontrarlo en http://xp-dev.com/svn/RecreateError/trunk/

No sé cuál es mi avería pero comienzo la actividad y registro el ciclo de vida de la actividad. El resultado:

 11-10 22:26:45.960: I/seasons log(2274): onCreate() 11-10 22:26:45.990: I/seasons log(2274): onStart() 11-10 22:26:45.990: I/seasons log(2274): onResume() 

Ahora presiono el icono de barra de acción para activar la bandera de recrear y cambiar a otra aplicación …

 11-10 22:30:26.390: I/seasons log(2274): onPause() 11-10 22:30:27.080: I/seasons log(2274): onStop() 

Y volver a mi Actividad con recrear bandera activada lo que se hará recrear () en onResume ().

 11-10 22:33:05.500: I/seasons log(2274): onCreate() 11-10 22:33:05.510: I/seasons log(2274): onStart() 11-10 22:33:05.510: I/seasons log(2274): onResume() 11-10 22:33:05.510: I/seasons log(2274): onPause() 

OnPause? Pero mi Actividad es visible, ¿qué estoy haciendo mal? El estado correcto no es onResume ()?

Y ahora si cambio a otra aplicación consigo el error.

Gracias por su tiempo y lo siento por mi mal inglés.


En este momento no entiendo cómo aplicaciones como File Manager HD hacen esta acción.

Dos Actividades: Actividad Principal A, Actividad B con PreferenceFragment como contenido principal.

Una opción que cambia el tema entre Holo y Holo.Light, Actividad B cambia con un método OnSharedPreferenceChangeListener en PreferenceFragment pero cuando volvemos a la actividad principal el método recreate() en onResume() falla, ¿cómo hacerlo?

Estoy confundido. Lo siento.

Para ello, utilice un controlador:

 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.what==MSG_RECREATE) recreate(); } }; @Override protected void onResume() { if(condition) { Message msg = handler.obtainMessage(); msg.what = MSG_RECREATE; handler.sendMessage(msg); } } 

Esto no se bloqueará más.

No sé si esto es la causa de sus problemas, pero no se comparan Cuerdas como esta en Java;

 protected void onResume() { ... if (recreate == "S") { recreate = "N"; recreate(); } 

Utilice if ("S".equals(recreate)) lugar.

Usted nunca debe estar llamando onPause onCreate onResume etc por su cuenta. No deberías usar recreate() para lo que quieres hacer, poner el código de inicialización en otro lugar si necesita actualizarse. Además, utilice un entero para almacenar el estado del programa en lugar de una cadena, luego declare algunas variables finales a la referencia, por ejemplo

 public final int RECREATE_ON = 1; public final int RECREATE_OFF = 2; private int recreate = RECREATE_OFF; ... if(recreate==RECREATE_ON){ recreate(); } 

Recuerde lo que recreate () está haciendo:

Haga que esta actividad se vuelva a crear con una nueva instancia. Esto resulta esencialmente en el mismo flujo que cuando se crea la actividad debido a un cambio de configuración: la instancia actual pasará por su ciclo de vida a onDestroy () y se creará una nueva instancia después de ella.

Esta es la razón por la que está recibiendo el mensaje onPause .

  • Realización de una parada de actividad que no se reanuda - Android
  • Actividad ciclo de vida: ¿Por qué se establece en "Pausado" y no "Detenido"
  • ¿Puede Wi-Fi o la CPU ir a dormir cuando la pantalla está encendida?
  • View.getContext devuelve null, ¿por qué?
  • Android: onPostResume se llama después de que se reanude el fragmento
  • Cómo saber si un Fragmento fue recreado o retenido
  • ¿Por qué OnCreate () de Fragment se llama a veces antes de OnCreate de Activity ()?
  • Los fragmentos de ViewPager no se recrean después de FragmentTransaction.replace () seguido por el botón de retroceso
  • La aplicación se bloquea en rotación sin stackTrace
  • ¿Cuánto manejo del ciclo de vida de Android es demasiado?
  • Android: al cambiar entre dos actividades, el orden de llamada de los métodos de ciclo de vida de la actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.