Aktivite hedefleri

Gezinme grafiğinizde, varış noktası etkinlik olabilir. Uygulamanızda tek bir etkinliğin olması en iyi uygulama olsa da, uygulamalar genellikle uygulama içindeki farklı bileşenler veya ekran için ayrı etkinlikler kullanır. Etkinlik hedefleri bu gibi durumlarda yararlı olabilir.

Compose ve Kotlin DSL

Gezinme grafiğinize etkinlik hedefi eklemek, hem Compose'da hem de Kotlin DSL'yi parçalarla kullanırken aynıdır. Bunun nedeni, NavGraph öğenizi oluşturulan oluşturulmuş NavHost öğenize aktarırken aynı createGraph() lambda'yı kullanmanızdır.

Daha fazla bilgi için Kotlin DSL kullanarak programatik olarak grafik oluşturma bölümüne bakın.

XML

activity hedefi oluşturmak, parça hedefi oluşturmaya benzer. Bununla birlikte, bir etkinlik varış noktasının doğası oldukça farklıdır.

Varsayılan olarak, Gezinme kitaplığı NavController öğesini bir Activity düzenine ekler ve etkin gezinme grafiğinin kapsamı etkin Activity olarak ayarlanır. Kullanıcı farklı bir Activity öğesine giderse geçerli gezinme grafiği artık kapsam dışındadır. Yani Activity hedefi, gezinme grafiğinde uç nokta olarak kabul edilmelidir.

Bir etkinlik hedefi eklemek için tam nitelikli sınıf adıyla birlikte Activity hedefini 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, aşağıdaki startActivity() çağrısına eşdeğer:

Kotlin

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

Java

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

Bu yaklaşımın uygun olmadığı durumlarla karşılaşabilirsiniz. Örneğin, etkinlik sınıfına derleme zamanı bağımlılığınız olmayabilir veya bir implicit intent'i geçmenin dolaylı düzeyini tercih edebilirsiniz. Activity hedefi için manifest girişindeki intent-filter, Activity hedefini nasıl yapılandırmanız gerektiğini belirtir.

Örneğin, şu manifest dosyasını ele alalım:

<?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 hedefinin, manifest girişindekilerle eşleşen action ve data özellikleriyle yapılandırılması gerekir:

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

targetPackage'in geçerli applicationId için belirtilmesi, kapsamı ana uygulamayı içeren geçerli uygulamayla sınırlandırır.

Aynı mekanizma, belirli bir uygulamanın hedef olmasını istediğiniz durumlarda kullanılabilir. Aşağıdaki örnekte, bir hedef applicationId com.example.android.another.app değerine sahip 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ılmıştır. Ayrıca, ek bilgilerin URL'nin bir parçası olarak gönderildiği dinamik URL'leri desteklemeniz gerekebilir. Örneğin, User-ID'yi https://example.com?userId=<actual user ID> benzeri bir biçimde URL içinde gönderebilirsiniz.

Bu durumda, data özelliği yerine dataPattern özelliğini kullanın. Daha sonra dataPattern değeri içindeki adlandırılmış yer tutucularla değiştirilecek 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, Güvenli Bağımsız Değişkenler veya Bundle kullanarak bir userId değeri 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, {userId} yerine someUser kullanılır ve https://example.com?userId=someUser URI değeri oluşturulur.