Я пишу приложение, которое требует, чтобы вы вошли в систему перед использованием. Из моего понимания андроида до сих пор вам нужно выбрать, какую деятельность запускать, когда вы открываете из запуска в манифесте. Я не знаю, какую деятельность я хочу запустить во время компиляции. Я хочу, чтобы пользователь щелкнул значок, затем я проверяю и проверяю, вошли ли они в систему, а затем решите на основе этого, следует ли запускать операцию входа в систему или основное действие приложения. Есть ли способ сделать это?
Как я могу динамически выбирать, какую активность запускать при открытии приложения?
Ответ 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);
Ответ 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 будет запущен.