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

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

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

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

Açık derin bağlantı, kullanıcıları uygulamanızdaki belirli bir konuma yönlendirmek için PendingIntent kullanan derin bağlantının tek bir örneğidir. Örneğin, bir bildirim veya uygulama widget'ı kapsamında açık derin bağlantı gösterebilirsiniz.

Kullanıcı uygulamanızı açık bir derin bağlantı üzerinden açtığında görev geri yığını temizlenir ve derin bağlantı hedefiyle değiştirilir. Grafikler iç içe yerleştirilirken, iç içe yerleştirme seviyesinin her birindeki başlangıç hedefi (yani hiyerarşideki her <navigation> öğesinin başlangıç hedefi) de yığına eklenir. Bu, bir kullanıcı derin bağlantı hedefinden Geri düğmesine bastığında, uygulamanıza giriş noktasından girmiş gibi gezinme yığınında geriye doğru ilerlediği anlamına gelir.

Aşağıdaki örnekte gösterildiği gibi, PendingIntent oluşturmak için NavDeepLinkBuilder sınıfını kullanabilirsiniz. Sağlanan bağlam bir Activity değilse yapıcının, varsa başlatılacak varsayılan etkinlik olarak PackageManager.getLaunchIntentForPackage() kullandığını unutmayın.

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 manifestinde belirtilen varsayılan başlatma Activity işleminde başlatır. NavHost öğeniz başka bir etkinlikteyse 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'iniz varsa doğrudan geliştiriciye 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();

Mevcut bir NavController'unuz varsa NavController.createDeepLink() kullanarak da derin bağlantı oluşturabilirsiniz.

Kapalı derin bağlantı oluşturma

Yarı açık derin bağlantı, uygulamadaki belirli bir hedefi ifade eder. Derin bağlantı çağrıldığında (ör. bir kullanıcı bağlantıyı tıkladığında) Android, uygulamanızı ilgili hedefte açabilir.

Derin bağlantılar URI, intent işlemleri ve MIME türlerine göre 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şlemesine, ardından işleme ve ardından MIME türüne öncelik verildiğini unutmayın.

Aşağıda, URI, işlem ve MIME türü içeren bir örnek derin bağlantı 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 dolaylı derin bağlantı oluşturmak için Gezinme Düzenleyici'yi de kullanabilirsiniz. Bunun için:

  1. Gezinme Düzenleyici'nin Tasarım sekmesinde, derin bağlantının hedefini seçin.
  2. Özellikler panelinin Derin Bağlantılar bölümünde + simgesini tıklayın.
  3. Açılan Derin Bağlantı Ekle iletişim kutusunda derin bağlantınızın bilgilerini girin.

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

    • Şeması olmayan URI'lerin http veya https olduğu varsayılır. Ö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 parametrelerle eşleştirerek yer tutucu değerlerini uygun türlere ayrıştırmaya çalışır. Aynı ada sahip bir bağımsız değişken tanımlanmazsa 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ı, yol parametreleri yerine veya bunlarla 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 boş değerle tanımlanan değişkenler için 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. Bu durum, yol parametreleri için geçerli değildir. Örneğin, gerekli yol parametresi sağlanmadığı için http://www.example.com/users?arg1=7&arg2=28 yukarıdaki kalıpla eşleşmez.
    • Yabancı sorgu parametreleri, derin bağlantı URI eşleşmesini etkilemez. Örneğin, extraneousParam URI kalıbında tanımlanmamış olsa bile http://www.example.com/users/{id}, http://www.example.com/users/4?extraneousParam=7 ile eşleşir.
  4. (isteğe bağlı) Google'ın URI'nin sahibi olduğunuzu doğrulamasını zorunlu kılmak için Otomatik Doğrulama'yı işaretleyin. Daha fazla bilgi için Android App Links'i doğrulama başlıklı makaleyi inceleyin.

  5. Ekle'yi tıklayın. Hedefin derin bağlantısı olduğunu belirtmek için seçili hedefin üzerinde bir bağlantı simgesi görünür.

  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ük derin bağlantıyı etkinleştirmek için uygulamanızın manifest.xml dosyasına da ekleme yapmanız gerekir. Aşağıdaki örnekte gösterildiği gibi, mevcut bir gezinme grafiğini 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>

Gezinme bileşeni, projenizi oluştururken gezinme grafiğindeki tüm derin bağlantılarla eşleşecek şekilde <nav-graph> öğesini oluşturulan <intent-filter> öğeleriyle değiştirir.

Kapalı derin bağlantı tetiklendiğinde, arka yığının durumu kapalı Intent'ün Intent.FLAG_ACTIVITY_NEW_TASK işaretiyle başlatılıp başlatılmadığına bağlıdır:

  • İşaretçi ayarlanırsa görev geri yığını temizlenir ve derin bağlantı hedefiyle değiştirilir. Açık derin bağlantılarda olduğu gibi, grafikleri iç içe yerleştirirken her iç içe yerleştirme seviyesindeki başlangıç hedefi (yani hiyerarşideki her <navigation> öğesinin başlangıç hedefi) de yığına eklenir. Bu, bir kullanıcı derin bağlantı hedefinden Geri düğmesine bastığında, uygulamanıza giriş noktasından girmiş gibi gezinme yığınında geriye doğru ilerlediği anlamına gelir.
  • İşaretçi ayarlanmazsa, gizli 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 standard için varsayılan launchMode değerini kullanmanız önemle tavsiye edilir. standard başlatma modu kullanıldığında Gezinme, Intent içindeki açık veya gizli derin bağlantıları işlemek için handleDeepLink()'yi çağırarak derin bağlantıları otomatik olarak işler. Ancak Activity, singleTop gibi alternatif bir launchMode kullanılırken yeniden kullanıldığında bu işlem otomatik olarak gerçekleşmez. Bu durumda, aşağıdaki örnekte gösterildiği gibi onNewIntent() içinde handleDeepLink()'ü manuel olarak çağırmanız 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 göz atın.

Codelab uygulamaları

Videolar