2012-03-05 29 views
6

Tengo un extraño comportamiento en mi solicitud de cambio de orientación.Segunda instancia de actividad después del cambio de orientación

El comportamiento normal:
Cuando abro mi aplicación mi actividad comienza en casa. Cuando voy a la siguiente actividad (una galería), comienza normalmente (con una animación deslizante de derecha a izquierda). Cuando vuelvo utilizando la tecla de retroceso, la actividad actual (la galería) finaliza (con una animación deslizable de izquierda a derecha).

El comportamiento extraño:

  • Cuando estoy empezando la aplicación en modo vertical y cambiar la orientación a horizontal. Luego hay algo así como una segunda instancia de la actividad hogareña. Porque al presionar el botón Atrás en modo horizontal no se cierra la aplicación como lo haría sin cambio de orientación (la actividad en el hogar es la primera actividad en mi aplicación) pero hago una animación deslizante de izquierda a derecha (como comenzar una nueva actividad) y muestra la actividad hogareña (pero creo que otra instancia) nuevamente. Al presionar el botón Atrás una segunda vez, se cierra la aplicación.
  • Cuando estoy iniciando la aplicación en modo apaisado y cambio la orientación al modo vertical, presione luego el botón Atrás para obtener una animación de diapositivas de derecha a izquierda (como cerrar una actividad) y muestra la actividad de la casa nuevamente.
  • Cuando inicio la aplicación y hago dos cambios de orientación portrait-landscape-portrait, el botón Atrás cierra la aplicación como debería ser.

Así que es como el paisaje y el modo retrato se tratan como dos actividades diferentes.

No utilizo android:configChanges="orientation|keyboardHidden|screenSize", por lo que un cambio de orientación debe seguir el ciclo de vida normal de la actividad android y destruir la versión de retrato (o paisaje) "vieja" de la actividad.
Mis actividades heredan de FragmentActivity. Estoy usando onSaveInstanceState para pasar un parceable (que no contiene ninguna referencia a la actividad) y estoy usando onRetainCustomNonConfigurationInstance (read here) para pasar varios AsyncTask s. Pero todas las referencias en estas tareas (si las hay) se destruyen en onRetainCustomNonConfigurationInstance y se restauran (con la actividad recién creada) después de getLastCustomNonConfigurationInstance.

¿Alguna idea de qué podría causar este comportamiento?

EDIT:
Declaración Actividad en el manifiesto-File:
<activity android:name=".activities.smartphone.HomeSmartphone" android:label="@string/app_name"></activity>

HomeSmartphone extiende Inicio
principal va MyFragmentActivity
MyFragmentActivity extiende android.support.v4.app.FragmentActivity

En MyFragmentActivity Acabo de hacer algunas tareas de registro/seguimiento en onCreate, onRestart, onStart, onSaveInstanceState, onPause, onResu me, onStop, onDestroy llamando a algunos métodos estáticos de una clase de seguimiento, que solo contiene una referencia al contexto de la aplicación. No al contexto de la actividad.

Home es una clase abstracta que se amplía con HomeSmartphone y HomeTablet.Estas dos clases hacen solo un cargamento/refresco/inicialización especial en los diferentes diseños.

La mayor parte de tareas se realizan en la clase abstracta Inicio.



    public HomeRetainedObjects retained = new HomeRetainedObjects(); 

    public boolean adIsShown = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.home); 

     Log.i("DEBUG", "onCreate(Home)"); 

     if (savedInstanceState != null) { 
      this.adIsShown = savedInstanceState.getBoolean("adIsShown"); 
     } 

    // write/update values in shared preferences 
     this.initPreferences(); 

    // recover retained objects (mostly AsyncTasks) 
     this.recoverRetained(); 

    // show content/refresh content 
     this.init(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putBoolean("adIsShown", this.adIsShown); 

     Log.i("DEBUG", "onSaveInstanceState(Home)"); 
    } 

    public void recoverRetained() { 
     Object retained = this.getLastCustomNonConfigurationInstance(); 
     if (retained instanceof HomeRetainedObjects) { 
      this.retained = (HomeRetainedObjects) retained; 

      if (this.retained.loadMessageTask != null) { 
       this.retained.loadMessageTask.restoreContext(this); 
      } 
     } 
    } 

    @Override 
    public Object onRetainCustomNonConfigurationInstance() { 
     if (this.retained.loadMessageTask != null) { 
      this.retained.loadMessageTask.destroyContext(); 
     } 

     return this.retained; 
    } 

Espero que esto ayude ?!

+0

muéstranos el código ... –

+0

... incluida la declaración de actividad en tu manifiesto, por favor. – Turnsole

+3

+1 para una pregunta bien planteada que nos muestre sus esfuerzos :) –

Respuesta

0

Me encontré con un problema similar, y parece que la causa de sus problemas está anulando onRetainCustomNonConfigurationInstance().

Revisé mi objeto de estado de retención y encontré que contenía una referencia a Context. Lo envolví en un WeakReference y se devolvió el comportamiento normal y no persistieron extrañas instancias dobles.

¿Quizás su estado de retención también tiene una referencia a un Context?

Cuestiones relacionadas