Как мне динамически выбирать, какое действие запускать при открытии приложения? - PullRequest
53 голосов
/ 05 мая 2010

Я пишу приложение, которое требует, чтобы вы вошли в службу перед использованием. Из моего понимания андроида до сих пор вы должны выбирать, какую деятельность запускать при открытии из панели запуска в манифесте. Я не знаю, какую деятельность я хочу запустить во время компиляции. Я хочу, чтобы пользователь щелкнул значок, затем я проверил и вошел ли он в систему, а затем решил, основываясь на том, запускать ли действие входа в систему или основное действие приложения. Есть ли способ сделать это?

Ответы [ 4 ]

64 голосов
/ 05 мая 2010

Нет, так как вам нужно запустить какой-то код, нет способа декларативно (в манифесте) сказать это. Вы должны запустить действие (заданное в манифесте), а затем решить, будет ли это действие основано на том, вошел ли пользователь в систему или нет, какое второе действие запустить через Intent:

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

Intent newActivity = new Intent(context, activityClass);
context.startActivity(newActivity);
6 голосов
/ 16 апреля 2016

Есть еще один способ сделать это, используя псевдоним активности .

  1. В Манифесте:

    <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. Где-то в активности входа:

    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);
    

после этого приложение будет убито один раз, а в следующий раз, когда вы запустите приложение, будет запуск MainActivity.

1 голос
/ 05 июня 2019

Android Framewowrk предоставляет метод
public Intent setClassName (String packageName, String className)

класса Intent, который вы можете использовать, чтобы динамически выбирать, какое действие вызывать, просто используя имя класса в String.

Вот пример

    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)

0 голосов
/ 29 июля 2017

Так же, как и выше @auval сказал, я тестирую код, как показано ниже, и это хорошо! Сначала файл AndroidManifest.xml выглядит следующим образом:

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

Во-вторых, вы можете поместить этот код где-нибудь в 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);
         }

Теперь, когда вы впервые запускаете приложение, запускается LauncherActivity, а когда вы выходите из приложения, снова запускаете приложение, запускается MainActivity.

...