54 votes

Comment choisir dynamiquement l'activité à lancer lors de l'ouverture d'une application ?

J'écris une application qui exige que vous soyez connecté à un service avant de l'utiliser. D'après ce que j'ai compris d'Android jusqu'à présent, vous devez choisir l'activité à lancer lorsque vous ouvrez à partir du lanceur dans le manifeste. Je ne sais pas quelle activité je veux lancer au moment de la compilation. Je veux que l'utilisateur clique sur l'icône, puis je vérifie s'il est connecté, puis je décide en fonction de cela de lancer l'activité de connexion ou l'activité de l'application principale. Existe-t-il un moyen de faire cela ?

67voto

Ricardo Villamil Points 3080

Non, puisque vous devez exécuter du code, il n'y a aucun moyen de le dire de manière déclarative (dans le manifeste). Vous devez lancer une activité (définie dans le manifeste), puis faire en sorte que cette activité décide, en fonction du fait que l'utilisateur est connecté ou non, de la deuxième activité à lancer via l'Intent :

final Class<? extends Activity> activityClass;
if(userIsLoggedOn())
    activityClass = LoggedOnActivity.class;
else
    activityClass = LogInActivity.class;

Intent newActivity = new Intent(context, activityClass);
context.startActivity(newActivity);

57 votes

Une chose à noter est qu'il est possible de lancer une activité sans afficher d'interface utilisateur, de sorte que vous pouvez obtenir l'impression qu'elle fait ce que vous voulez... Notez que votre logique doit se faire assez rapidement pour que l'utilisateur ne s'en aperçoive pas. Il suffit de mettre le code suivant dans le manifeste de votre activité : Android:theme="@Android:style/Theme.NoDisplay"

0 votes

Pouvez-vous détecter que vous allez à Main au moment du lancement ou à un autre moment ? Puisque quelqu'un pourrait vouloir aller à une activité différente selon qu'il s'agit d'un lancement ou non ?

3 votes

Cela perturbe-t-il la hiérarchie ? Par exemple, un utilisateur peut-il appuyer sur le bouton "retour" et se retrouver à cette activité ?

7voto

Ali.DM Points 218

Il existe un autre moyen de le faire en utilisant activité-alias .

  1. Dans le Manifeste :

    <activity
        android:name=".LoginActivity"
        android:icon="@drawable/ic_launcher_main"
        android:label="Login" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    <activity
        android:name=".MainActivity"
        android:icon="@drawable/ic_launcher_main"
        android:label="MainActivity" >
    </activity>
    
    <activity-alias
        android:name=".AliasActivity"
        android:label="AliasActivity"
        android:enabled="false"
        android:targetActivity=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>

    2.Quelque part dans l'activité de connexion :

    String s = getApplicationContext().getPackageName();
    ComponentName cm = new ComponentName(s, s+".AliasActivity");
    ComponentName cm2 = new ComponentName(s, s+".Login");
    PackageManager pm = this.getPackageManager();
    pm.setComponentEnabledSetting(cm, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 1);
    pm.setComponentEnabledSetting(cm2, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);

après cela, l'application sera tuée une fois et la prochaine fois que vous lancerez l'application, la MainActivity sera le lanceur.

1voto

Harsha Points 198

Le cadre Android fournit la méthode
public Intent setClassName (String packageName, String className)

de la classe Intent que vous pouvez utiliser pour choisir dynamiquement l'activité à invoquer avec seulement le nom de la classe dans String.

Voici un exemple

    String packageName = getPackageName(), className=packageName+"subFolder.myActivity";
    Intent i = new Intent();
    i.setClassName(packageName, className);
    startActivity(i); 

https://developer.Android.com/reference/Android/content/Intent.html#setClassName(java.lang.String,%20java.lang.String)

0voto

MichaelZ Points 11

Comme l'a dit @auval, j'ai testé le code ci-dessous et il fonctionne bien ! Au début, le fichier AndroidManifest.xml ressemble à ceci :

 <activity
     android:name=".LauncherActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

<activity
    android:name=".MainActivity">
</activity>

<activity-alias
    android:name=".AliasActivity"
    android:enabled="false"
    android:targetActivity=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity-alias>

Ensuite, vous pouvez placer ces codes quelque part dans la classe MainActivity.class :

private void changeLauncher() {
         String s = getApplicationContext().getPackageName();
         ComponentName cm = new ComponentName(s, s + ".AliasActivity");
        ComponentName cm2 = new ComponentName(s, s + ".LauncherActivity");
        PackageManager pm = this.getPackageManager();
        pm.setComponentEnabledSetting(cm,
           PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
           PackageManager.DONT_KILL_APP );
        pm.setComponentEnabledSetting(cm2, 
           PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
           PackageManager.DONT_KILL_APP);
         }

Maintenant, lorsque vous lancez l'application pour la première fois, l'activité LauncherActivity est lancée et lorsque vous quittez l'application et la relance, l'activité MainActivity est lancée.

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