Sto scrivendo un'app che richiede l'accesso a un servizio prima di utilizzarlo. Dalla mia comprensione di Android finora, devi scegliere quale attività avviare quando apri dal programma di avvio nel manifest. Non so quale attività voglio avviare in fase di compilazione. Voglio che l'utente faccia clic sull'icona, poi controllo e vedo se sono loggati, quindi decido in base a questo se avviare l'attività di accesso o l'attività dell'app principale. C'è un modo per fare questo?Come scegliere dinamicamente l'attività da avviare all'apertura di un'app
risposta
No, dal momento che è necessario eseguire del codice, non c'è modo di dichiararlo (in chiaro) per dirlo. Bisogna avviare un'attività (impostato nel manifesto), poi questa attività decidere in base a se l'utente è connesso o meno quale attività secondo per lanciare 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);
C'è un altro modo per farlo utilizzando activity-alias.
nel manifesto:
<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.Somewhere nel Attività di accesso:
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);
dopo che, l'applicazione sarà ucciso una volta e la prossima volta che si avvia app, MainActivity sarebbe il programma di avvio.
Fantastico !! L'unica soluzione che non richiede attività aggiuntive e la lettura di preferenze condivise sul thread dell'interfaccia utente. Puoi usare il flag PackageManager.DONT_KILL_APP invece di 0 o 1, quindi l'app non uscirà. C'è ancora un problema che mi impedisce di usarlo: la prossima esecuzione da Android Studio fallisce. (l'attività è disabilitata) – auval
Ho lavorato a questa limitazione aggiungendo una configurazione di esecuzione per l'attività principale.Quindi questa soluzione funziona bene – auval
Questa risposta sembra quella che dovrebbe essere accettata. –
Proprio come sopra detto @auval, eseguo il test del codice come indicato di seguito e funziona bene! In un primo momento, il file AndroidManifest.xml è simile a questa:
<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>
In secondo luogo, si può mettere questi codice in qualche parte nel 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);
}
Ora, quando si avvia il primo app, LauncherActivity verrà avviato e quando si esce dall'app, eseguire nuovamente l'app, verrà avviato MainActivity.
Una cosa da notare è che è possibile avviare un'attività senza visualizzare un'interfaccia utente, in modo da farla sembrare come se stesse facendo ciò che si desidera ... Si noti che la logica dovrebbe essere fatta abbastanza velocemente, quindi non è Notevole per l'utente. Basta inserire il seguente codice all'interno del manifest della tua attività: android: theme = "@ android: style/Theme.NoDisplay" – Justin
Riesci a rilevare che stai andando a Main in fase di lancio rispetto ad un'altra volta? Dal momento che si potrebbe voler avviare un'attività diversa in base al fatto che si tratti di un lancio? – Androider
Approccio molto, molto bello, grazie! –