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


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

3   51  

3 ответа:

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

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

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

есть еще один способ сделать это с помощью activity-alias.

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

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

Так же, как выше @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.класс:

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 будет запущен.