Aktivitätsziele

In Ihrem Navigationsdiagramm kann ein Ziel eine Aktivität sein. Es ist zwar am besten, wenn Ihre App nur eine Aktivität hat, aber häufig werden separate Aktivitäten für verschiedene Komponenten oder Bildschirme in einer App verwendet. In solchen Fällen können Aktivitätsziele nützlich sein.

Compose und Kotlin DSL

Das Hinzufügen eines Aktivitätsziels zu Ihrem Navigationsdiagramm ist in Compose und bei Verwendung der Kotlin-DSL mit Fragmenten im Wesentlichen dasselbe. Das liegt daran, dass Sie beim Übergeben von NavGraph an die zusammensetzbare Funktion NavHost dieselbe createGraph()-Lambda-Funktion verwenden.

Weitere Informationen finden Sie unter Fragments und die Kotlin-DSL.

XML

Das Erstellen eines Aktivitätsziels ähnelt dem Erstellen eines Fragmentziels. Das Ziel einer Aktivität ist jedoch ganz anders.

Standardmäßig wird in der Navigationsbibliothek das NavController an ein Activity-Layout angehängt und der aktive Navigationsgraph ist auf das aktive Activity beschränkt. Wenn ein Nutzer zu einem anderen Activity navigiert, ist der aktuelle Navigationsgraph nicht mehr relevant. Das bedeutet, dass ein Activity-Ziel als Endpunkt in einem Navigationsdiagramm betrachtet werden sollte.

Wenn Sie ein Aktivitätsziel hinzufügen möchten, geben Sie das Ziel Activity mit seinem voll qualifizierten Klassennamen an:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">

    <activity
        android:id="@+id/sampleActivityDestination"
        android:name="com.example.android.navigation.activity.DestinationActivity"
        android:label="@string/sampleActivityTitle" />
</navigation>

Dieses XML entspricht dem folgenden Aufruf von startActivity():

Kotlin

startActivity(Intent(context, DestinationActivity::class.java))

Java

startActivity(new Intent(context, DestinationActivity.class));

Es kann Fälle geben, in denen dieser Ansatz nicht angemessen ist. Möglicherweise haben Sie beispielsweise keine Kompilierungszeitabhängigkeit von der Aktivitätsklasse oder Sie bevorzugen die Indirektionsebene, die durch eine implizite Intention erreicht wird. Die intent-filter im Manifesteintrag für das Ziel Activity gibt vor, wie Sie das Ziel Activity strukturieren müssen.

Betrachten Sie beispielsweise die folgende Manifestdatei:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.navigation.activity">
    <application>
        <activity android:name=".DestinationActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <data
                    android:host="example.com"
                    android:scheme="https" />
                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Das entsprechende Activity-Ziel muss mit den Attributen action und data konfiguriert werden, die mit denen im Manifesteintrag übereinstimmen:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">
    <activity
        android:id="@+id/localDestinationActivity"
        android:label="@string/localActivityTitle"
        app:action="android.intent.action.VIEW"
        app:data="https://example.com"
        app:targetPackage="${applicationId}" />
</navigation>

Wenn Sie targetPackage für die aktuelle applicationId angeben, wird der Bereich auf die aktuelle Anwendung beschränkt, einschließlich der Haupt-App.

Derselbe Mechanismus kann auch verwendet werden, wenn Sie möchten, dass eine bestimmte App das Ziel ist. Im folgenden Beispiel wird ein Ziel als App mit einem applicationId von com.example.android.another.app definiert.

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">
    <activity
        android:id="@+id/localDestinationActivity"
        android:label="@string/localActivityTitle"
        app:action="android.intent.action.VIEW"
        app:data="https://example.com"
        app:targetPackage="com.example.android.another.app" />
</navigation>

Dynamische Argumente

In den vorherigen Beispielen wurden feste URLs verwendet, um zu Zielen zu navigieren. Möglicherweise müssen Sie auch dynamische URLs unterstützen, bei denen zusätzliche Informationen als Teil der URL gesendet werden. Sie können beispielsweise eine Nutzer-ID in einer URL mit einem Format ähnlich wie https://example.com?userId=<actual user ID> senden.

Verwenden Sie in diesem Fall anstelle des Attributs data das Attribut dataPattern. Anschließend können Sie Argumente angeben, die für benannte Platzhalter im dataPattern-Wert eingesetzt werden sollen:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">
    <activity
        android:id="@+id/localDestinationActivity"
        android:label="@string/localActivityTitle"
        app:action="android.intent.action.VIEW"
        app:dataPattern="https://example.com?userId={userId}"
        app:targetPackage="com.example.android.another.app">
        <argument
            android:name="userId"
            app:argType="string" />
    </activity>
</navigation>

In diesem Beispiel können Sie einen userId-Wert entweder mit Safe Args oder mit einem Bundle angeben:

Kotlin

navController.navigate(
    R.id.localDestinationActivity,
    bundleOf("userId" to "someUser")
)

Java

Bundle args = new Bundle();
args.putString("userId", "someUser");
navController.navigate(R.id.localDestinationActivity, args);

In diesem Beispiel wird someUser durch {userId} ersetzt und der URI-Wert https://example.com?userId=someUser erstellt.