47 votes

Activité de démarrage dynamique dans Android ?

Existe-t-il un moyen de changer dynamiquement l'activité de démarrage dans Android en fonction d'une condition ? Ce que j'ai essayé de faire (et qui n'a pas fonctionné) est le suivant :

  1. supprimer la catégorie LAUNCHER telle que définie dans mon AndroidManifest.xml
  2. créer une classe d'application personnalisée que l'application utilise
  3. remplacer la méthode onCreate de ma classe Application pour définir un code comme le suivant :

.

if (condition) {
    startActivity(new Intent(this, MenuActivity.class));
} else {
    startActivity(new Intent(this, LoginActivity.class));
}

59voto

dave.c Points 9120

Pourquoi ne pas avoir une première Activity sans interface utilisateur qui vérifie la condition dans son onCreate puis lance la prochaine Activity puis appelle finish() sur lui-même ? Je n'ai jamais appelé finish() de l'intérieur onCreate() cependant, donc je ne suis pas sûr que cela fonctionne.

EDIT
Il semble que cela fonctionne bien. Voici un peu de code pour le rendre plus clair.
Initial 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()
}

Autre Activity :

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

8voto

Matt Quiros Points 2236

Voici ce que j'ai fait personnellement pour l'un de mes petits projets mobiles. Au lieu de créer une application séparée, sans écran Activity où se trouve la condition et qui lance l'écran correspondant, je mets la condition dans une Activity et a fait une dynamique setContentView() comme dans :

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

Deux remarques importantes à propos de cette approche :

1 : Au lieu d'écrire cela dans onCreate() vous voulez mettre la prise de décision à l'intérieur onResume() précisément parce que ce dernier est toujours appelé lorsque l'écran doit être affiché en avant. Vous pouvez voir cela dans l'application Android cycle de vie des activités . Ainsi, si, par exemple, l'utilisateur vient de télécharger mon application et la lance pour la première fois, comme aucun utilisateur n'est connecté, il sera dirigé vers la page d'inscription. Lorsqu'il aura terminé de s'inscrire et que, pour une raison quelconque, il appuiera sur la touche HOME bouton (pas BACK (qui quitte complètement l'application !) et reprend ensuite l'application, la disposition qu'elle verra est déjà celle de l'écran d'accueil. Si je place la conditionnelle à l'intérieur de onCreate() ce qui aurait été affiché, c'est l'écran d'inscription, car selon le cycle de vie, il ne retourne pas à l'écran d'inscription. onCreate() lors du retour d'une application à l'avant.

2 : Cette solution n'est idéale que si la fusion des fonctionnalités de ces deux activités ne produit pas un long bloc de code diabolique. Comme je l'ai dit, mon projet était de petite taille (sa fonctionnalité principale se produit en arrière-plan), de sorte que cette unique dynamique Activity n'avait pas beaucoup d'éléments. Le sans écran Activity est certainement la meilleure solution si vous souhaitez que votre code soit plus lisible par l'homme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X