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:
- Gezinme Düzenleyici'nin Tasarım sekmesinde, derin bağlantının hedefini seçin.
- Özellikler panelinin Derin Bağlantılar bölümünde + simgesini tıklayın.
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
hemhttp://www.google.com
hem dehttps://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 birString
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
veyahttp://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çinhttp://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 bilehttp://www.example.com/users/{id}
,http://www.example.com/users/4?extraneousParam=7
ile eşleşir.
- Şeması olmayan URI'lerin http veya https olduğu varsayılır. Örneğin,
(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.
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.
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.