Pregunta

¿Hay alguna forma de cambiar dinámicamente la actividad inicial en Android en función de un condicional? Lo que intenté hacer (que no funcionó) fue lo siguiente:

  1. Elimine la categoría de lanzador como se define en mi androidmanifest.xml
  2. crear una clase de aplicación personalizada que usa la aplicación
  3. Anule el método OnCreate de mi clase de aplicación para definir algún código como el siguiente:

.

if (condition) {
    startActivity(new Intent(this, MenuActivity.class));
} else {
    startActivity(new Intent(this, LoginActivity.class));
}
¿Fue útil?

Solución

¿Por qué no tener una inicial Activity sin interfaz de usuario que verifique la condición en su onCreate, luego lanza el siguiente Activity, luego llama finish() ¿en sí mismo? Nunca he llamado finish() desde adentro onCreate() Sin embargo, no estoy seguro de si esto funcionará.

EDITAR
Parece funcionar bien. Aquí hay algún código para dejarlo más claro.
Inicial Activity:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent;
    if (condition) {
       intent = new Intent(this, ClassA.class);
    } else {
       intent = new Intent(this, ClassB.class);
    }
    startActivity(intent);
    finish();
    // note we never called setContentView()
}

Otro Activity:

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

Otros consejos

Esto es lo que personalmente hice por uno de mis pequeños proyectos móviles. En lugar de crear un separado, sin pantalla Activity Donde está la condición y qué inicia la pantalla correspondiente, pongo la condición en una Activity e hizo una dinámica setContentView(), como en:

if (!userIsLoggedIn) {
    setContentView(R.layout.signup);
} else {
    setContentView(R.layout.homescreen);
}

Dos notas importantes para este enfoque:

1: en lugar de escribir eso en onCreate(), quieres poner la toma de decisiones dentro onResume() Precisamente porque este último siempre se llama cada vez que la pantalla debe mostrarse en el frente. Puedes ver eso desde el Android ciclo de vida de la actividad. Entonces, si, por ejemplo, el usuario acaba de descargar mi aplicación y la lanzó por primera vez, porque ningún usuario ha iniciado sesión, ella será llevada a la página de registro. Cuando haya terminado de inscribirse y por alguna razón presiona el HOME botón (no BACK, ¡que sale de la aplicación por completo!) Y luego reanuda la aplicación, el diseño que verá ya es la pantalla de inicio. Si pongo el condicional dentro onCreate(), lo que se habría mostrado es la pantalla de registro porque según el ciclo de vida, no se remonta a onCreate() Al traer de vuelta una aplicación al frente.

2: Esta solución es ideal solo si fusionar las funcionalidades de esas dos actividades no produciría un largo bloque de código diabólico. Como dije, mi proyecto era pequeño (su característica principal ocurre en segundo plano), de modo que esa única dinámica Activity no tenía demasiado en eso. La pantalla sin Activity Definitivamente es el camino a seguir si necesita que su código sea más legible por humanos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top