Middle
Wie geht man mit der Situation um, wenn eine Aktivität aufgrund eines Deeplinks mehrfach geöffnet wird?
sobes.tech KI
Antwort von AI
Es gibt mehrere Ansätze:
-
Verwendung von Flags im Intent:
FLAG_ACTIVITY_SINGLE_TOP: Wenn die Aktivität bereits oben im Stapel ist, wird anstelle der Erstellung einer neuen Instanz die MethodeonNewIntent()aufgerufen.FLAG_ACTIVITY_CLEAR_TOP: Wenn die Aktivität bereits im Stapel existiert, werden alle darüber liegenden Aktivitäten beendet und die Aktivität nach oben gebracht.- In Kombination mit
FLAG_ACTIVITY_NEW_TASK: Wird häufig mitCLEAR_TOPverwendet, um mit Aktivitäten aus einer anderen Aufgabe zu arbeiten.
-
Einstellung des
launchModein AndroidManifest.xml:singleTop: Ähnlich wieFLAG_ACTIVITY_SINGLE_TOPbeim Start überIntent.singleTask: Die Aktivität ist die Wurzel einer neuen Aufgabe; wenn eine Instanz bereits in einer Aufgabe existiert, wird sie nach vorne geholt und alle Aktivitäten darüber beendet.singleInstance: Die Aktivität existiert in ihrer eigenen Aufgabe und ist die einzige Aktivität in dieser Aufgabe.
-
Überprüfung der Existenz der Aktivität vor dem Start:
- Verwenden Sie
ActivityManager, um den aktuellen Stapel der Aktivitäten zu überprüfen. Dieser Ansatz ist weniger bevorzugt aufgrund seiner Komplexität und Kosten.
- Verwenden Sie
-
Reaktion auf
onNewIntent():- Bei Verwendung von
singleTopoderFLAG_ACTIVITY_SINGLE_TOPsollte die gesamte Logik zur Verarbeitung des Deeplinks inonNewIntent()implementiert werden, nicht inonCreate(). Vergessen Sie nicht,setIntent(intent)inonNewIntent()aufzurufen, um den Intent zu aktualisieren, der übergetIntent()zugänglich ist.
- Bei Verwendung von
Beispiel für die Verwendung von launchMode="singleTop" und onNewIntent():
In AndroidManifest.xml:
<activity
android:name=".YourDeeplinkActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="your_scheme"
android:host="your_host"
android:pathPrefix="/your_path" />
</intent-filter>
</activity>
In der Aktivitätsklasse YourDeeplinkActivity:
class YourDeeplinkActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_deeplink)
// Anfangsverarbeitung, wenn die Aktivität erstellt wird
handleIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// Wichtig, um den Intent zu aktualisieren
setIntent(intent)
// Verarbeitung des neuen Intents (deeplink)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
intent?.data?.let { uri ->
// Logik zur Verarbeitung der URI des Deeplinks
Log.d("DeeplinkActivity", "Empfangener Deeplink: $uri")
// Zum Beispiel Parameter extrahieren und zum gewünschten Fragment navigieren
}
}
}
Die Wahl der Methode hängt vom konkreten Szenario und dem gewünschten Verhalten im Aktivitätspool ab. Die gebräuchlichste Lösung für Deeplinks, die zu einer bereits bestehenden Aktivität führen, ist die Verwendung von launchMode="singleTop" und die Verarbeitung in onNewIntent().