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:
- 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ğ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
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,
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.
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.
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.