Sobes.tech
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:

  1. 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 Methode onNewIntent() 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 mit CLEAR_TOP verwendet, um mit Aktivitäten aus einer anderen Aufgabe zu arbeiten.
  2. Einstellung des launchMode in AndroidManifest.xml:

    • singleTop: Ähnlich wie FLAG_ACTIVITY_SINGLE_TOP beim Start über Intent.
    • 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.
  3. Ü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.
  4. Reaktion auf onNewIntent():

    • Bei Verwendung von singleTop oder FLAG_ACTIVITY_SINGLE_TOP sollte die gesamte Logik zur Verarbeitung des Deeplinks in onNewIntent() implementiert werden, nicht in onCreate(). Vergessen Sie nicht, setIntent(intent) in onNewIntent() aufzurufen, um den Intent zu aktualisieren, der über getIntent() zugänglich ist.

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().