Bir hedef için derin bağlantı oluşturma

Android'de derin bağlantı, sizi doğrudan uygulama içindeki belirli bir hedefe yönlendiren bağlantıdır.

Gezinme bileşeni, iki farklı derin bağlantı türü oluşturmanıza olanak tanır: açık ve örtülü.

Açık bir derin bağlantı oluşturma

Açık derin bağlantı, kullanıcıları uygulamanızdaki belirli bir konuma götürmek için PendingIntent kullanan tek bir derin bağlantı örneğidir. Örneğin, bir bildirimin veya uygulama widget'ının parçası olarak uygunsuz bir derin bağlantı gösterebilirsiniz.

Bir kullanıcı açık bir derin bağlantı aracılığıyla uygulamanızı açtığında görev geri yığını temizlenir ve yerine derin bağlantı hedefi getirilir. Grafikleri iç içe yerleştirirken her bir iç içe yerleştirme seviyesinden başlangıç hedefi (yani hiyerarşideki her <navigation> öğesinin başlangıç hedefi) de yığına eklenir. Yani bir kullanıcı derin bağlantı hedefinde Geri düğmesine bastığında, uygulamanıza giriş noktasından girmiş gibi gezinme yığınında geri gider.

Aşağıdaki örnekte gösterildiği gibi bir PendingIntent oluşturmak için NavDeepLinkBuilder sınıfını kullanabilirsiniz. Sağlanan bağlam Activity değilse oluşturucu, başlatmak için varsayılan etkinlik olarak (varsa) PackageManager.getLaunchIntentForPackage() değerini kullanır.

Kotlin

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .createPendingIntent()

Java

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .createPendingIntent();

Varsayılan olarak NavDeepLinkBuilder, açık derin bağlantınızı uygulamanızın manifest dosyasında beyan edilen varsayılan lansman Activity ile başlatır. NavHost başka bir etkinlikte yer alıyorsa derin bağlantı oluşturucuyu oluştururken bileşen adını belirtmeniz gerekir:

Kotlin

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .setComponentName(DestinationActivity::class.java)
    .createPendingIntent()

Java

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_graph)
        .setDestination(R.id.android)
        .setArguments(args)
        .setComponentName(DestinationActivity.class)
        .createPendingIntent();

ComponentName adınız varsa doğrudan oluşturucuya iletebilirsiniz:

Kotlin

val componentName = ...

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .setComponentName(componentName)
    .createPendingIntent()

Java

ComponentName componentName = ...;

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_graph)
        .setDestination(R.id.android)
        .setArguments(args)
        .setComponentName(componentName)
        .createPendingIntent();

NavController hesabınız varsa NavController.createDeepLink() kullanarak da derin bağlantı oluşturabilirsiniz.

Örtülü derin bağlantı oluşturma

Örtülü derin bağlantı, bir uygulamadaki belirli bir hedefi belirtir. Derin bağlantı çağrıldığında, örneğin kullanıcı bir bağlantıyı tıkladığında Android, uygulamanızı ilgili hedefe açabilir.

Derin bağlantılar URI, intent işlemleri ve MIME türleriyle eşleştirilebilir. Tek bir derin bağlantı için birden fazla eşleme türü belirtebilirsiniz ancak önce URI bağımsız değişkeni eşleşmesine, ardından işlem ve MIME türüne öncelik verildiğini unutmayın.

URI, işlem ve MIME türünü içeren bir derin bağlantı örneği aşağıda verilmiştir:

<fragment android:id="@+id/a"
          android:name="com.example.myapplication.FragmentA"
          tools:layout="@layout/a">
        <deepLink app:uri="www.example.com"
                app:action="android.intent.action.MY_ACTION"
                app:mimeType="type/subtype"/>
</fragment>

Bir hedefe yönelik kapalı bir derin bağlantı oluşturmak için aşağıdaki gibi Gezinme Düzenleyici'yi de kullanabilirsiniz:

  1. Gezinme Düzenleyicisi'nin Tasarım sekmesinde derin bağlantı için hedefi seçin.
  2. Özellikler panelinin Derin Bağlantılar bölümünde + işaretini tıklayın.
  3. Görüntülenen Derin Bağlantı Ekle iletişim kutusunda, derin bağlantınızın bilgilerini girin.

    Aşağıdakileri göz önünde bulundurun:

    • Şema içermeyen URI'ler http veya https olarak kabul edilir. Örneğin, www.google.com hem http://www.google.com hem de https://www.google.com ile eşleşir.
    • {placeholder_name} biçimindeki yol parametresi yer tutucuları bir veya daha fazla karakterle eşleşir. Örneğin, http://www.example.com/users/{id}, http://www.example.com/users/4 ile eşleşir. Gezinme bileşeni, yer tutucu adlarını derin bağlantı hedefi için tanımlanan tanımlı bağımsız değişkenlerle eşleştirerek yer tutucu değerleri uygun türlere ayırmaya çalışır. Aynı ada sahip herhangi bir bağımsız değişken tanımlanmamışsa bağımsız değişken değeri için varsayılan bir String türü kullanılır. 0 veya daha fazla karakteri eşleştirmek için .* joker karakterini kullanabilirsiniz.
    • Sorgu parametresi yer tutucuları, path parametrelerinin yerine veya onlarla birlikte kullanılabilir. Örneğin, http://www.example.com/users/{id}?myarg={myarg}, http://www.example.com/users/4?myarg=28 ile eşleşir.
    • Varsayılan veya null özellikli değerlerle tanımlanan değişkenlerin sorgu parametresi yer tutucularının eşleşmesi gerekmez. Örneğin, http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2}, http://www.example.com/users/4?arg2=28 veya http://www.example.com/users/4?arg1=7 ile eşleşir. Yol parametreleri için böyle bir durum söz konusu değildir. Örneğin, http://www.example.com/users?arg1=7&arg2=28, gerekli path parametresi sağlanmadığı için yukarıdaki kalıpla eşleşmez.
    • Fazladan sorgu parametreleri, derin bağlantı URI eşleşmesini etkilemez. Örneğin http://www.example.com/users/{id}, URI kalıbında extraneousParam tanımlı olmasa da http://www.example.com/users/4?extraneousParam=7 ile eşleşir.
  4. (isteğe bağlı) Google'ın URI'nın sahibi olduğunuzu doğrulamasını istemek için Otomatik Doğrula'yı işaretleyin. Daha fazla bilgi için Android Uygulama Bağlantılarını Doğrulama konusuna bakın.

  5. Ekle'yi tıklayın. Seçili hedefin üzerinde bir bağlantı simgesi görünür. Bu simge, hedefin derin bağlantısı olduğunu gösterir.

  6. XML görünümüne geçmek için Kod sekmesini tıklayın. Hedefe iç içe yerleştirilmiş bir <deepLink> öğesi eklendi:

    <deepLink app:uri="https://www.google.com" />
    

Örtülü derin bağlantıyı etkinleştirmek için uygulamanızın manifest.xml dosyasına da eklemeler yapmanız gerekir. Aşağıdaki örnekte gösterildiği gibi, mevcut bir gezinme grafiğine işaret eden bir etkinliğe tek bir <nav-graph> öğesi ekleyin:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application ... >

        <activity name=".MainActivity" ...>
            ...

            <nav-graph android:value="@navigation/nav_graph" />

            ...

        </activity>
    </application>
</manifest>

Projenizi oluştururken Gezinme bileşeni, gezinme grafiğindeki tüm derin bağlantıları eşleştirmek için <nav-graph> öğesini, oluşturulan <intent-filter> öğeleriyle değiştirir.

Dolaylı bir derin bağlantı tetiklenirken arka yığının durumu, örtülü Intent öğesinin Intent.FLAG_ACTIVITY_NEW_TASK işaretiyle başlatılıp başlatılmadığına bağlıdır:

  • İşaret ayarlanırsa görev arka yığını temizlenir ve derin bağlantı hedefiyle değiştirilir. Açık derin bağlantıda olduğu gibi, grafikleri iç içe yerleştirirken her bir iç içe yerleştirme seviyesinden başlangıç hedefi (yani hiyerarşideki her <navigation> öğesinin başlangıç hedefi) de yığına eklenir. Yani bir kullanıcı derin bağlantı hedefinde Geri düğmesine bastığında, uygulamanızı giriş noktasından girmiş gibi gezinme yığınında geri gider.
  • İşaret ayarlanmamışsa örtülü derin bağlantının tetiklendiği önceki uygulamanın görev yığınında kalırsınız. Bu durumda, Geri düğmesi sizi önceki uygulamaya geri götürürken Yukarı düğmesi uygulamanızın görevini gezinme grafiğinizdeki hiyerarşik üst hedefte başlatır.

Derin bağlantıları işleme

Navigasyon'u kullanırken her zaman varsayılan launchMode standard değerinin kullanılması önemle tavsiye edilir. standard başlatma modu kullanılırken Navigasyon, Intent içindeki açık veya örtülü derin bağlantıları işlemek için handleDeepLink() yöntemini çağırarak derin bağlantıları otomatik olarak işler. Ancak Activity, singleTop gibi alternatif bir launchMode kullanılırken tekrar kullanılırsa bu işlem otomatik olarak gerçekleşmez. Bu durumda, aşağıdaki örnekte gösterildiği gibi onNewIntent() içinde handleDeepLink() öğesini manuel olarak çağırmak gerekir:

Kotlin

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    navController.handleDeepLink(intent)
}

Java

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    navController.handleDeepLink(intent);
}

Ek kaynaklar

Gezinme hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.

Sana Özel

Codelab uygulamaları

Videolar