Ich schreibe eine App, für die Sie sich bei einem Dienst anmelden müssen, bevor Sie sie verwenden können. Nach meinem bisherigen Verständnis von Android müssen Sie auswählen, welche Aktivität gestartet werden soll, wenn Sie den Launcher im Manifest öffnen. Ich weiß nicht, welche Aktivität ich zur Kompilierzeit starten möchte. Ich möchte, dass der Benutzer auf das Symbol klickt, dann überprüfe ich, ob er angemeldet ist, und entscheide dann basierend darauf, ob die Anmeldeaktivität oder die Haupt-App-Aktivität gestartet werden soll. Gibt es eine Möglichkeit, dies zu tun?
Wie wähle ich dynamisch aus, welche Aktivität beim Öffnen einer App gestartet werden soll?
Nein, da Sie Code ausführen müssen, gibt es keine Möglichkeit, dies deklarativ (im Manifest) zu sagen. Sie müssen eine Aktivität starten (im Manifest festgelegt) und diese Aktivität dann entscheiden lassen, je nachdem, ob der Benutzer angemeldet ist oder nicht, welche zweite Aktivität über Intent gestartet werden soll:
final Class<? extends Activity> activityClass;
if(userIsLoggedOn())
activityClass = LoggedOnActivity.class;
else
activityClass = LogInActivity.class;
Intent newActivity = new Intent(context, activityClass);
context.startActivity(newActivity);
-
Eine Sache, die zu beachten ist, ist, dass es möglich ist, eine Aktivität zu starten, ohne eine Benutzeroberfläche anzuzeigen, damit sie so aussieht, als würde sie das tun, was Sie wollen … Beachten Sie, dass Ihre Logik ziemlich schnell ausgeführt werden sollte, damit sie nicht auffällt an den Benutzer. Fügen Sie einfach den folgenden Code in das Manifest Ihrer Aktivität ein: android:theme=”@android:style/Theme.NoDisplay”
– Justin
3. Februar 2011 um 22:52 Uhr
-
Kannst du erkennen, dass du beim Start zum Main gehst und nicht zu einem anderen Zeitpunkt? Da man vielleicht zu einer anderen Aktivität wechseln möchte, je nachdem, ob es sich um einen Start handelt?
– Androider
19. Februar 2011 um 23:26 Uhr
-
Bringt das die Hierarchie durcheinander? dh kann ein Benutzer die Zurück-Taste drücken und bei dieser Aktivität landen?
– James Parsons
1. Oktober 2015 um 1:31 Uhr
-
@James_Parsons stellen Sie nur sicher, dass Sie keine PARENT_ACTIVITY in die Metadaten der Aktivität aufnehmen.
– Fehlfunktion
29. Januar 2016 um 14:10 Uhr
-
Häh, was ist mit der Application-Klasse? Wenn Sie eine Unterklasse von android.app.Application implementieren, sollten Sie Code ausführen, ohne eine Aktivität anzuzeigen, oder irre ich mich?!
– Ichor des Dionysos
19. Februar 2016 um 19:46 Uhr
Ali.DM
Es gibt eine andere Möglichkeit, dies zu tun Aktivitäts-Alias.
-
Im Manifest:
<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. Irgendwo in der Anmeldeaktivität:
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);
Danach wird die App einmal beendet und das nächste Mal, wenn Sie die App starten, wäre die MainActivity der Launcher.
-
Kühl!! Die einzige Lösung, die keine zusätzliche Aktivität und das Lesen gemeinsamer Einstellungen im UI-Thread erfordert. Sie können das Flag PackageManager.DONT_KILL_APP anstelle von 0 oder 1 verwenden, damit die App nicht beendet wird. Es gibt immer noch ein Problem, das mich daran hindert, dies zu verwenden: Die nächste Ausführung von Android Studio schlägt fehl. (Aktivität ist deaktiviert)
– Amir Uwal
7. Januar 2017 um 16:02 Uhr
-
Ich habe diese Einschränkung umgangen, indem ich eine Ausführungskonfiguration für die Hauptaktivität hinzugefügt habe. Diese Lösung funktioniert also gut
– Amir Uwal
7. Januar 2017 um 16:34 Uhr
-
Diese Antwort scheint diejenige zu sein, die akzeptiert werden sollte.
– Bertram Gilfoyle
2. Januar 2018 um 5:46 Uhr
-
Dies bricht leider die Symbole in einigen Launchern und löscht Symbolverknüpfungen, die auf den meisten Startbildschirmen hinzugefügt wurden.
– Igor Čordaš
10. August 2018 um 15:18 Uhr
-
Wie Igor sagte, scheint gut zu sein, funktioniert aber nicht stabil. In einigen Fällen funktioniert das Launcher-Symbol nicht. Wenn ich die Aktivität geändert und die Anwendung beendet habe, wurde manchmal der Toast „Anwendung ist nicht installiert“ angezeigt. Nach einer Sekunde wurde die Launcher-Aktivität geändert.
– Ilkayaktas
2. Dezember 2020 um 12:36 Uhr
Harscha
Das Android Framework stellt die Methode bereit
public Intent setClassName (String packageName, String className)
der Intent-Klasse, die Sie verwenden können, um dynamisch auszuwählen, welche Aktivität nur mit dem Namen der Klasse in String aufgerufen werden soll.
Hier ist ein Beispiel
String packageName = getPackageName(), className=packageName+"subFolder.myActivity";
Intent i = new Intent();
i.setClassName(packageName, className);
startActivity(i);
Genau wie oben @auval sagte, teste ich den Code wie unten und es funktioniert gut! Zunächst sieht die Datei AndroidManifest.xml so aus:
<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>
Zweitens können Sie diesen Code irgendwo in die MainActivity.class einfügen:
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);
}
Wenn Sie die App jetzt zum ersten Mal starten, wird die LauncherActivity gestartet, und wenn Sie die App beenden und die App erneut ausführen, wird die MainActivity gestartet.