web-dev-qa-db-fra.com

Comment configurer l'activité de Launcher par programme dans Android?

Je travaille sur une application avec deux activités: LoginActivity et MainActivity. Lorsque l'utilisateur ouvre l'application pour la première fois, il se connecte et ses informations d'identification (nom d'utilisateur et jeton) sont enregistrées dans Preferences

Désormais, si l'utilisateur ouvre à nouveau l'application, MainActivity doit commencer. J'ai essayé de basculer entre ces activités dans la classe Application et j'ai supprimé le filtre d'intention de LAUNCHER_ACTIVITY du fichier manifeste, mais cela ne fonctionne pas. 

Existe-t-il un moyen de basculer entre les activités de lancement, par programme, sur la base des préférences enregistrées?

14
aruke

En bref, vous ne pouvez pas changer la Activity qui est lancée par défaut. Mise à jour: Il existe une alternative telle que décrite par CommonsWare dans une autre réponse.

Cependant, il existe des solutions raisonnables. Dans votre MainActivity, vous pouvez vérifier si l'utilisateur est connecté et le rediriger immédiatement vers la LoginActivity. Cela présente l’avantage supplémentaire de revenir automatiquement à la MainActivity après vous être connecté.

Sinon, vous pouvez toujours aller d'abord à LoginActivity et si l'utilisateur est déjà connecté, envoyez-les à MainActivity (réécrivez l'historique des intentions pour supprimer le retour à LoginActivity ou définissez le drapeau noHistory dans le manifeste).

13
Knossos

Existe-t-il un moyen de basculer entre les activités de lancement, par programme, sur la base des préférences enregistrées?

Vous pouvez essayer ceci:

Étape 1: Demandez à LoginActivity d’avoir le LAUNCHER<intent-filter> comme à l’habitude, et à MainActivity de ne pas avoir <intent-filter>.

Étape n ° 2: Ayez un élément <activity-alias> dans le manifeste pointant vers MainActivity et ayant le LAUNCHER<intent-filter>.

Étape n ° 3: Mettez Android:enabled="false" sur le <activity-alias>, il est donc désactivé par défaut. Ainsi, lors de la première installation de l'application, la seule icône du lanceur correspond à LoginActivity.

Étape n ° 4: Lorsque l'utilisateur se connecte et que vous souhaitez modifier afin que MainActivity soit l'activité de lancement, utilisez PackageManager et setComponentEnabledSetting() pour activer le <activity-alias> et désactiver le LoginActivity.

Tous les écrans d’accueil ne détectent pas ce changement à la volée et, pour ceux-là, l’appareil aurait besoin de redémarrer selon toute probabilité pour prendre en compte le changement. Pour cette raison, il serait préférable de s'en tenir à une seule activité de lanceur. Si vous le souhaitez, cette activité de lancement pourrait avoir Theme.NoDisplay et simplement acheminer vers la "vraie" activité correcte dans onCreate(), selon la réponse de Fahim.

19
CommonsWare

Le moyen le plus simple est de rendre l'activité du lanceur MainActivity, comme d'habitude.
Enregistrez ensuite MainActivity#onCreate(Bundle) via SharedPreferences si l'utilisateur s'est déjà connecté et, si ce n'est pas le cas, démarrez LoginActivity immédiatement. Lorsque l'utilisateur se connecte, enregistrez l'indicateur booléen indiquant qu'il s'est connecté SharedPreferences et terminez MainActivity.

3
aga

Une activité ne nécessite pas nécessairement une interface utilisateur. Vous pouvez donc utiliser l'activité de lancement du manifeste pour lancer l'activité que vous souhaitez.

2
Olayinka

Autant que je sache, il n'est pas possible de modifier le programme de lancement au moyen d'un programme, mais cela n'a également aucun sens. 

Sur la variable onCreate de votre LoginActivity, vérifiez si un nom d'utilisateur et un jeton sont déjà enregistrés. Si vous essayez de vous connecter automatiquement avec cela, vous avez réussi la redirection vers votre MainAcivity. Selon le mode de fonctionnement de votre application, vous pouvez avoir une variable qui vérifie si un utilisateur est connecté ou non. S'il est connecté, LoginActivity le redirigera vers MainActivity sans essayer de se reconnecter.

//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();
    }
}

Vous pouvez également le configurer pour enregistrer le nom d'utilisateur et le jeton uniquement si une connexion est réussie, ce qui signifie que le code ci-dessus peut être modifié comme suit:

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

Cela ne tentera pas de vous connecter, mais il sait que les informations d'identification sont correctes, car il s'est connecté au moins une fois avec eux.

Si votre application se comporte différemment, ces méthodes ne fonctionnent pas, n'hésitez pas à le dire, je pourrais peut-être vous fournir plus d'informations.

2
TomTsagk

Vous pouvez simplement ajouter Intention après OnCreate au XML que vous souhaitez afficher au début de votre application.

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);
       } 
   ..........
   ...........
0
Loyal Fine