Aktivite hedefleri

Gezinme grafiğinizde hedef bir etkinlik olabilir. Uygulamanızda tek bir etkinlik olması en iyi uygulama olsa da uygulamalar genellikle bir uygulama içindeki farklı bileşenler veya ekranlar için ayrı etkinlikler kullanır. Bu gibi durumlarda etkinlik hedefleri yararlı olabilir.

Compose ve Kotlin DSL

Gezinme grafiğinize etkinlik hedefi eklemek, hem Compose'da hem de Kotlin DSL'yi parçalarla kullanırken temelde aynıdır. Bunun nedeni, NavGraph öğenizi NavHost composable'ınıza iletirken aynı createGraph() lambda'yı kullanmanızdır.

Daha fazla bilgi için Parçalar ve Kotlin DSL başlıklı makaleyi inceleyin.

XML

Etkinlik hedefi oluşturmak, parça hedefi oluşturmaya benzer. Ancak etkinlik hedefinin yapısı oldukça farklıdır.

Varsayılan olarak, Navigation library, NavController öğesini bir Activity düzenine ekler ve etkin gezinme grafiği, etkin Activity ile sınırlandırılır. Kullanıcı farklı bir Activity'ya giderse mevcut gezinme grafiği artık kapsamda olmaz. Bu, bir Activity hedefin, gezinme grafiğindeki bir uç nokta olarak kabul edilmesi gerektiği anlamına gelir.

Etkinlik hedefi eklemek için hedefi Activity tam nitelikli sınıf adıyla birlikte belirtin:

<?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>

Bu XML, startActivity() için aşağıdaki çağrıya eşdeğerdir:

Kotlin

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

Java

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

Bu yaklaşımın uygun olmadığı durumlar olabilir. Örneğin, etkinlik sınıfında derleme zamanı bağımlılığınız olmayabilir veya dolaylı intent'ten geçmenin dolaylılık düzeyini tercih edebilirsiniz. Hedef Activity için bildirim girişindeki intent-filter, Activity hedefini nasıl yapılandırmanız gerektiğini belirler.

Örneğin, aşağıdaki manifest dosyasını inceleyin:

<?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>

İlgili Activity hedefi, manifest girişindeki özelliklerle eşleşen action ve data özellikleriyle yapılandırılmalıdır:

<?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>

Mevcut applicationId için targetPackage belirtilmesi, kapsamı ana uygulama da dahil olmak üzere mevcut uygulama ile sınırlar.

Aynı mekanizma, belirli bir uygulamanın hedef olmasını istediğiniz durumlarda da kullanılabilir. Aşağıdaki örnekte, hedef com.example.android.another.app applicationId olan bir uygulama olarak tanımlanmaktadır.

<?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>

Dinamik bağımsız değişkenler

Önceki örneklerde, hedeflere gitmek için sabit URL'ler kullanılıyordu. Ayrıca, ek bilgilerin URL'nin bir parçası olarak gönderildiği dinamik URL'leri de desteklemeniz gerekebilir. Örneğin, https://example.com?userId=<actual user ID> biçimine benzer bir URL'de kullanıcı kimliği gönderebilirsiniz.

Bu durumda, data özelliği yerine dataPattern özelliğini kullanın. Daha sonra, dataPattern değeri içindeki adlandırılmış yer tutucuların yerine geçecek bağımsız değişkenler sağlayabilirsiniz:

<?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>

Bu örnekte, userId değerini Safe Args veya Bundle ile belirtebilirsiniz:

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);

Bu örnekte someUser, {userId} yerine kullanılıyor ve https://example.com?userId=someUser URI değeri oluşturuluyor.