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:
- Gezinme Düzenleyicisi'nin Tasarım sekmesinde derin bağlantı için hedefi seçin.
- Özellikler panelinin Derin Bağlantılar bölümünde + işaretini tıklayın.
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
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 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 birString
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
veyahttp://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ındaextraneousParam
tanımlı olmasa dahttp://www.example.com/users/4?extraneousParam=7
ile eşleşir.
- Şema içermeyen URI'ler http veya https olarak kabul edilir. Örneğin,
(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.
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.
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.