Подтвердить что ты не робот

Как я могу динамически выбирать, какую активность запускать при открытии приложения?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Существует другой способ сделать это, используя activity-alias.

  • В манифесте:

    <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 будет запуском.

Ответ 3

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)

Ответ 4

Как и выше, @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 будет запущен.