Android'de derin bağlantı, sizi doğrudan bir uygulamanın belirli bir hedefine yönlendiren bağlantıdır.
Uygulamanızda iki farklı derin bağlantı türünü destekleyebilirsiniz: açık ve örtülü. Derin bağlantıları uygulama şekliniz, uygulamanızın kullandığı grafik türüne (XML or programmatic) bağlı olarak değişir.
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 tek bir derin bağlantı örneğidir. Örneğin, açık derin bağlantıyı bildirim veya uygulama widget'ı kapsamında gösterebilirsiniz.
Bir kullanıcı, uygulamanızı açık bir derin bağlantı aracılığıyla açtığında görev geri yığını temizlenir ve derin bağlantı hedefiyle değiştirilir. Grafikler iç içe yerleştirildiğinde, iç içe yerleştirmenin her seviyesindeki başlangıç hedefi (yani hiyerarşideki her <navigation> öğesinin başlangıç hedefi) de yığına eklenir.
Bu, bir kullanıcının derin bağlantı hedefinden Geri düğmesine bastığında, uygulamanıza giriş noktasından girmiş gibi gezinme yığınında geriye doğru gezinmesini sağlar.
Programatik grafikler
Gezinme grafiğiniz programatik olarak tanımlanmışsa (Navigation Compose veya Kotlin DSL'de olduğu gibi) derin bağlantı oluşturmak için TaskStackBuilder kullanmanızı öneririz PendingIntent.
val id = "exampleId"
val context = LocalContext.current
val deepLinkIntent = Intent(
Intent.ACTION_VIEW,
"https://www.example.com/profile/$id".toUri(),
context,
MyActivity::class.java
)
val pendingIntent: PendingIntent? = TaskStackBuilder.create(context).run {
addNextIntentWithParentStack(deepLinkIntent)
getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
}
XML grafikleri
Aşağıdaki örnekte gösterildiği gibi, NavDeepLinkBuilder
sınıfını kullanarak PendingIntent oluşturabilirsiniz. Sağlanan bağlam bir Activity değilse oluşturucunun, 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, uygulamanızın manifestinde belirtilen varsayılan başlatma Activity için açık derin bağlantınızı 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 varsa bunu 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();
Mevcut bir NavController varsa NavController.createDeepLink() kullanarak da derin bağlantı oluşturabilirsiniz.
Kapalı derin bağlantı oluşturma
Kapalı derin bağlantı, uygulamadaki belirli bir hedefi ifade eder. Derin bağlantı çağrıldığında (ör. kullanıcı bir bağlantıyı tıkladığında) Android, uygulamanızı ilgili hedefte açabilir.
Derin bağlantılar URI, amaç 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 URI bağımsız değişken eşlemesinin önce, ardından işlemin ve son olarak MIME türünün öncelikli olduğunu unutmayın.
Programatik grafikler
Navigasyon grafiğinizi programatik olarak (Navigation Compose veya Kotlin DSL kullanarak) tanımlarsanız derin bağlantıları kodda tanımlarsınız.
Oluştur
Navigation Compose'da, composable() parametresini kullanarak derin bağlantıları deepLinks hedef oluşturucunun bir parçası olarak tanımlayabilirsiniz. NavDeepLink nesnelerinin listesini kabul eder. Bu nesneleri navDeepLink() işlevini kullanarak oluşturabilirsiniz:
@Serializable
data class Profile(val id: String)
val uri = "https://www.example.com"
composable<Profile>(
deepLinks = listOf(
navDeepLink<Profile>(basePath = "$uri/profile")
)
) { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(id = profile.id)
}
Kotlin DSL
Kotlin DSL'yi kullanırken hedef bloktaki deepLink() oluşturucu işlevini kullanarak derin bağlantılar tanımlayabilirsiniz:
@Serializable
data class Profile(val id: String)
val uri = "https://www.example.com"
fragment<ProfileFragment, Profile> {
deepLink<Profile>(basePath = "$uri/profile")
}
Programatik grafikler için amaç filtreleri ekleme
Programatik gezinme grafikleri çalışma zamanında oluşturulduğundan Navigation bileşeni, AndroidManifest.xml öğenizde eşleşen <intent-filter> öğelerini otomatik olarak oluşturamaz. Bunun yerine, uygun <intent-filter> öğelerini manuel olarak eklemeniz gerekir.
Önceki örneklerde derin bağlantıyı etkinleştirmek için manifestinizdeki ilgili <activity> öğesinin içine aşağıdakileri ekleyin:
<activity …>
<intent-filter>
...
<data android:scheme="https" android:host="www.example.com" />
</intent-filter>
</activity>
XML grafikleri
XML tabanlı bir grafikte kapalı derin bağlantı oluşturmak için <deepLink> öğesini doğrudan XML'de tanımlayabilir veya Gezinme Düzenleyici'yi kullanabilirsiniz.
URI, işlem ve MIME türü içeren bir örnek derin bağlantıyı aşağıda 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>
Ayrıca, bir hedefe kapalı derin bağlantı oluşturmak için Gezinme Düzenleyici'yi de aşağıdaki şekilde kullanabilirsiniz:
- Gezinme Düzenleyicisi'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ızla ilgili bilgileri girin.
Aşağıdakileri göz önünde bulundurun:
- Şeması olmayan URI'lerin
httpveyahttpsolduğu varsayılır. Örneğin,www.google.comhemhttp://www.google.comhem dehttps://www.google.comile 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/4ile eşleşir. Navigation bileşeni, yer tutucu adlarını derin bağlantı hedefi için tanımlanan arguments ile 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ımlanmamışsa bağımsız değişken değeri için varsayılanStringtü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=28ile eşleşir. - Varsayılan veya null 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=28veyahttp://www.example.com/users/4?arg1=7ile eşleşir. Bu durum, yol parametreleri için geçerli değildir. Örneğin,http://www.example.com/users?arg1=7&arg2=28gerekli yol parametresi sağlanmadığı için yukarıdaki kalıpla eşleşmez. - Gereksiz sorgu parametreleri, derin bağlantı URI'si eşleşmesini etkilemez. Örneğin,
http://www.example.com/users/{id}, URI kalıbındaextraneousParamtanımlanmamış olsa bilehttp://www.example.com/users/4?extraneousParam=7ile eşleşir.
- Şeması olmayan URI'lerin
(İsteğ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. Seçilen hedefin üzerinde, bu hedefin derin bağlantısı olduğunu belirten bir bağlantı simgesi
görünür.XML görünümüne geçmek için Kod sekmesini tıklayın. Hedefe yerleştirilmiş bir
<deepLink>öğesi eklendi:<deepLink app:uri="https://www.google.com" />
XML tabanlı grafiklerde ö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 Navigation bileşeni, gezinme grafiğindeki tüm derin bağlantılarla eşleşmesi için <nav-graph> öğesini oluşturulan <intent-filter> öğeleriyle değiştirir.
Kapalı derin bağlantılar ve geri yığını
Kapalı derin bağlantı tetiklenirken geri yığınının durumu, kapalı Intent öğesinin Intent.FLAG_ACTIVITY_NEW_TASK işaretiyle başlatılıp başlatılmadığına bağlıdır:
- Bu işaret ayarlanırsa görev geri yığını temizlenir ve derin bağlantı hedefiyle değiştirilir. Açık derin bağlantıda olduğu gibi, grafikler iç içe yerleştirildiğinde, iç içe yerleştirmenin her seviyesindeki başlangıç hedefi (yani hiyerarşideki her
<navigation>öğesinin başlangıç hedefi) de yığına eklenir. Bu, kullanıcının derin bağlantı hedefinden Geri düğmesine bastığında, uygulamanıza giriş noktasından girmiş gibi gezinme yığınında geriye doğru gezinmesi anlamına gelir. - İşaret ayarlanmazsa, kapalı 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
Navigasyonu kullanırken her zaman standard'ün varsayılan launchMode değerini kullanmanız önemle tavsiye edilir. standard başlangıç modu kullanılırken Navigation, handleDeepLink()'ı çağırarak derin bağlantıları otomatik olarak işler. Bu sayede, Intent içindeki tüm açık veya kapalı derin bağlantılar işlenir. Ancak, Activity, singleTop gibi alternatif bir launchMode kullanılırken yeniden kullanılıyorsa bu işlem otomatik olarak gerçekleşmez. Bu durumda, aşağıdaki örnekte gösterildiği gibi onNewIntent() içinde handleDeepLink() işlevini 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); }