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 bildirimin veya uygulama widget'ının parçası olarak açık 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 arka yığını temizlenir ve yerine derin bağlantı hedefi kullanılır. 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. Yani kullanıcı bir derin bağlantı hedefinden Geri düğmesine bastığında, uygulamanıza giriş noktasından giriyormuş gibi gezinme yığınında geri gider.

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'da 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.

URI, işlem ve MIME türü içeren örnek bir derin bağlantıyı burada bulabilirsiniz:

<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ğerlerle 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. Google'ın URI'nın sahibi olduğunuzu doğrulamasını zorunlu kılmak için Otomatik Doğrulama'yı işaretleyin. Daha fazla bilgi için Android Uygulama Bağlantılarını Doğrulama bölümüne bakın.

  5. Ekle'yi tıklayın. Seçilen hedefin üzerinde derin bir bağlantının olduğunu belirtmek için 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ğ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>

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.

Örnekler

Codelab'ler

Videolar