Tema de lanzamiento de marca con no mantener actividades

En mi aplicación utilizo el tema de lanzamiento de marca (la técnica explicada en esta publicación de Google+ ) para la actividad que se inicia desde la pantalla de inicio.

El problema es cuando el usuario navega de esa actividad a otra y la primera se mata en segundo plano (como cuando no tiene Don't keep activities activadas). En ese caso cada vez que el usuario presione de nuevo la actividad es recreada y mostrar el tema de "lanzamiento", al igual que cuando el usuario toque el icono en la pantalla de inicio.

Tal vez esto es técnicamente el comportamiento corregido, pero no ofrece una gran experiencia de usuario. Por otra parte, no es coherente con los cambios de configuración: en ese caso, cuando la actividad se recrea, parece que se inició con el tema "normal".

Actualización : Excavando dentro de este problema también traté de "engañar" con el tema inicial establecido cuando se inicia la actividad y descubrí que cuando Activity#setTheme se llama la primera vez con mi tema de "inicio" el fondo ya está visibile.

Esta solución supone que el único momento en que su actividad principal es asesinada es cuando el proceso se destruye (ignorando el caso Don't keep activities , ya que es sólo depuración, ¿no?).

  1. Cree una public static boolean haveShownLaunchTheme su clase de lanzador, vamos a llamar MainActivity . Por defecto a false;

  2. En cada actividad en su solución, deje que la primera línea de onCreate sea:

    MainActivity.haveShownLaunchTheme = true;

  3. En MainActivity.onCreate modifique como se muestra a continuación:

…de:

 setTheme(R.style.Theme_MyApp); super.onCreate(savedInstanceState); 

…a:

 if (!haveShownLaunchTheme) { haveShownLaunchTheme = true; setTheme(R.style.Theme_MyApp); } super.onCreate(savedInstanceState); 

También agregue la siguiente sustitución de onDestroy para apoyar la re-visualización del tema de lanzamiento cuando el usuario está saliendo normalmente a través del uso del botón de retroceso:

 @Override public void onDestroy { if (isFinishing()) haveShownLaunchTheme = false; super.onDestroy(); } 

Renuncia: No he probado este código exacto, pero he utilizado con éxito el patrón con la estática global para indicar si el proceso se ha matado o no antes.

Publico la respuesta que recibí de Ian Lake (@ianhanniballake) en G +:

"No mantener las actividades" es una opción de desarrollador por una razón – no es algo que debe estar desarrollando alrededor y no representativo de una situación en la que los usuarios estarán.

Lo usaría para probar para asegurarse de que restaurar el estado correctamente, pero eso es todo.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.