android android-activity android-applicationinfo

¿Cómo puedo configurar la actividad del iniciador mediante programación en Android?



android-activity android-applicationinfo (6)

¿Hay alguna forma de cambiar entre las actividades del iniciador mediante programación en función de las preferencias guardadas?

Puedes probar esto:

Paso 1: Tener LoginActivity tiene el LAUNCHER <intent-filter> como normal, y MainActivity no tiene <intent-filter> .

Paso # 2: Tener un elemento <activity-alias> en el manifiesto apuntando a MainActivity que tiene el LAUNCHER <intent-filter> .

Paso # 3: Ponga android:enabled="false" en <activity-alias> , por lo que está deshabilitado de forma predeterminada, por lo que cuando la aplicación se instala por primera vez, el único ícono de LoginActivity es LoginActivity .

Paso 4: cuando el usuario inicia sesión y desea cambiar para que MainActivity sea ​​la actividad del setComponentEnabledSetting() , use PackageManager y setComponentEnabledSetting() para habilitar <activity-alias> y deshabilitar LoginActivity .

No todas las pantallas de inicio detectarán este cambio sobre la marcha, y para esos, el dispositivo debería reiniciarse con toda probabilidad para recoger el cambio. Por esta razón, sería mejor quedarse con una sola actividad de iniciador. Si lo desea, esa actividad de Theme.NoDisplay podría tener Theme.NoDisplay y simplemente enrutar a la actividad "real" correcta en onCreate() , según la respuesta de Fahim.

Estoy trabajando en una aplicación con dos actividades: LoginActivity y MainActivity . Cuando el usuario abre la aplicación por primera vez, iniciará sesión y sus credenciales (nombre de usuario y token) se guardan en Preferences .

Ahora, si el usuario vuelve a abrir la aplicación, MainActivity debería comenzar. Intenté cambiar entre estas actividades en la clase de aplicación y eliminé el filtro de intención para LAUNCHER_ACTIVITY del manifiesto, pero no funciona.

¿Hay alguna forma de cambiar entre las actividades del iniciador mediante programación en función de las preferencias guardadas?


En pocas palabras, no puede cambiar la Activity que se inicia por defecto. Actualización: hay una alternativa según lo descrito por CommonsWare en otra respuesta.

Sin embargo, hay soluciones razonables. En su MainActivity puede verificar si el usuario ha iniciado sesión e inmediatamente redirigirlo a LoginActivity . Eso tiene el beneficio adicional de volver automáticamente a MainActivity después de haber iniciado sesión.

Alternativamente, siempre puede ir primero a LoginActivity , y si el usuario ya ha iniciado sesión, envíelo a MainActivity (reescriba el historial de Intenciones para eliminar el retorno a LoginActivity o configure el indicador noHistory en el manifiesto).


Hasta donde sé, no es posible cambiar el lanzador mediante programación, pero tampoco tiene sentido.

En onCreate de su onCreate verifique si un nombre de usuario y un token ya están guardados, si intenta iniciar sesión automáticamente, se redirige a su MainAcivity. Dependiendo de cómo funcione su aplicación, puede tener una variable que verifique si un usuario ha iniciado sesión o no, si es LoginActivity lo redirigirá a MainActivity sin intentar iniciar sesión nuevamente.

//LoginActivity onCreate(Bundle bundle) { /* ... */ //Or whatever you use to login (it could also go inside a thread or an AsyncTask if (login()) { //Intent Intent intent = new Intent(this, MainActivity.class); //Start Activity startActivity(intent); //Finish this activity, so when user pressed back the login activity will not come forth and the app will exit //this looks like when a user has logged in once, the login screen will not be visible to him (unless you want to) finish(); } }

También puede configurarlo para guardar el nombre de usuario y el token solo si un inicio de sesión es exitoso, lo que significa que el código anterior se puede modificar de esta manera:

if (getUsername() != null) { /* Start Main Activity */ }

Esto no intentará iniciar sesión, pero sabe que las credenciales son correctas ya que ha iniciado sesión al menos una vez con ellas.

Si su aplicación se comporta de una manera diferente a la que estos métodos no funcionan, no dude en decirlo, es posible que pueda proporcionarle más información


La forma más fácil es hacer que la actividad del iniciador MainActivity, como de costumbre.
Luego, MainActivity#onCreate(Bundle) través de SharedPreferences si el usuario ya SharedPreferences sesión y, si no, inicie LoginActivity inmediatamente. Cuando el usuario inicia sesión, guarde el indicador booleano que indica que el usuario SharedPreferences sesión en SharedPreferences y finalice MainActivity .


Puede simplemente agregar Intent después de OnCreate al XML que desea mostrar al comienzo de su APP.

public class LoginActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //add some code to detect if user is logged in if (user != null){ Intent in = new Intent(LoginActivity.this, YourDesiredActivity.class); startActivity(in); } .......... ...........


Una actividad no requiere necesariamente una interfaz de usuario, por lo que puede usar la actividad del iniciador en el manifiesto para iniciar cualquier actividad que desee.