web-dev-qa-db-fra.com

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

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

51
msfeldstein

Non, puisque vous devez exécuter du code, il n'y a aucun moyen de le déclarer (dans un manifeste) pour le dire. Vous devez lancer une activité (définie dans le manifeste), puis laisser cette activité décider si l'utilisateur est connecté ou non, quelle deuxième activité lancer via Intent:

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

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

Il existe un autre moyen de faire cela en utilisant activity-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.À un moment de 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 supprimée une fois et la prochaine fois que vous lancerez l'application, MainActivity sera le lanceur.

6
Ali.DM

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

de la classe d’intention que vous pouvez utiliser pour choisir dynamiquement l’activité à invoquer avec uniquement 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)

1
Harsha

Comme ci-dessus, @auval a dit: je teste le code comme ci-dessous et tout se passe 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>

Deuxièmement, vous pouvez insérer 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);
         }

Désormais, lorsque vous lancez l'application pour la première fois, LauncherActivity est lancé et lorsque vous quittez l'application, exécutez à nouveau l'application et MainActivity est lancé.

0
MichaelZ