¿Actividad de inicio dinámico en Android?


¿Hay una manera de cambiar dinámicamente la actividad de inicio en Android basado en una condicionalmente? 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 la aplicación utiliza
  3. invalida el método onCreate de mi clase Application para definir algún código como el siguiente:

.

if (condition) {
    startActivity(new Intent(this, MenuActivity.class));
} else {
    startActivity(new Intent(this, LoginActivity.class));
}
Author: Matt Huggins, 2011-02-01

2 answers

¿Por qué no tener una Activity inicial sin interfaz de usuario que comprueba la condición en su onCreate, luego lanza la siguiente Activity, luego llama a finish() sobre sí misma? Sin embargo, nunca he llamado finish() desde dentro onCreate(), así que no estoy seguro de si esto funcionará.

EDITAR
Parece funcionar bien. Aquí hay un código para hacerlo 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()
}

Otros Activity:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
 56
Author: dave.c,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-31 22:15:23

Esto es lo que hice personalmente para uno de mis pequeños proyectos móviles. En lugar de crear un Activity separado, sin pantalla donde está la condición y que lanza la pantalla correspondiente, puse la condición en uno Activity e hice un setContentView() dinámico, 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(), desea poner la toma de decisiones dentro de onResume() precisamente porque este último siempre se llama cuando la pantalla necesita ser se muestra en frente. Puedes verlo desde el ciclo de vida de la actividad de Android . Así que 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, se le dirigirá a la página de registro. Cuando haya terminado de registrarse y por alguna razón presione el botón HOME (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 tendría se muestra la pantalla de registro porque de acuerdo con el ciclo de vida, no vuelve a onCreate() cuando devuelve una aplicación al frente.

2: Esta solución es ideal solo si la fusión de las funcionalidades de esas dos Actividades no produciría un largo bloque diabólico de código. Como dije, mi proyecto era pequeño (su característica principal ocurre en segundo plano), por lo que single dynamic Activity no tenía demasiado en él. El Activity sin pantalla es definitivamente el camino a seguir si necesita su código para ser más legible por humanos.

 8
Author: Matt Quiros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-03 12:29:37