¿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.