Di Android, deep link adalah link yang mengarahkan Anda langsung ke tujuan tertentu dalam aplikasi.
Dengan komponen Navigasi, Anda dapat membuat dua jenis deep link yang berbeda: eksplisit dan implisit.
Membuat deep link eksplisit
Deep link eksplisit adalah satu instance
deep link yang menggunakan PendingIntent
untuk mengarahkan pengguna ke lokasi tertentu dalam aplikasi. Anda dapat menunjukkan
deep link eksplisit sebagai bagian dari, misalnya, notifikasi atau
widget aplikasi.
Saat pengguna membuka aplikasi Anda melalui deep link eksplisit, data tugas sebelumnya
akan dihapus dan diganti dengan tujuan deep link. Saat
membuat grafik bertingkat,
tujuan awal setiap level pembuatan grafik bertingkat, yaitu tujuan awal
setiap elemen <navigation>
di hierarki, juga akan ditambahkan ke stack.
Ini berarti saat menekan tombol Kembali dari tujuan
deep link, pengguna akan kembali ke stack navigasi seolah-olah mereka memasuki
aplikasi Anda dari titik masuknya.
Anda dapat menggunakan class NavDeepLinkBuilder
untuk membuat PendingIntent
,
seperti yang ditunjukkan dalam contoh di bawah. Perhatikan bahwa jika konteks yang diberikan bukan
Activity
, konstruktor menggunakan
PackageManager.getLaunchIntentForPackage()
sebagai aktivitas default yang akan diluncurkan, jika tersedia.
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();
Secara default, NavDeepLinkBuilder
meluncurkan deep link eksplisit Anda ke dalam
Activity
peluncuran default yang dideklarasikan dalam manifes aplikasi Anda. Jika
NavHost
berada dalam aktivitas lain, Anda harus menentukan nama komponennya
saat menyusun pembuat deep link:
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();
Jika memiliki ComponentName
,
Anda dapat meneruskannya langsung ke builder:
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();
Jika sudah memiliki NavController
,
Anda juga dapat membuat deep link dengan menggunakan
NavController.createDeepLink()
.
Membuat deep link implisit
Deep link implisit mengacu pada tujuan tertentu di aplikasi. Saat deep link dipanggil—misalnya, saat pengguna mengklik link—Android akan dapat membuka aplikasi Anda ke tujuan yang sesuai.
Deep link dapat dicocokkan berdasarkan URI, tindakan intent, dan jenis MIME. Anda dapat menentukan beberapa jenis pencocokan untuk satu deep link, tetapi perlu diketahui bahwa pencocokan argumen URI diprioritaskan terlebih dahulu, diikuti dengan tindakan, lalu jenis MIME.
Berikut adalah contoh deep link yang berisi URI, tindakan, dan jenis MIME:
<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>
Anda juga dapat menggunakan Editor Navigasi untuk membuat deep link implisit ke tujuan seperti berikut:
- Di tab Design pada Navigation Editor, pilih tujuan untuk deep link.
- Klik + di bagian Deep Links pada panel Attributes.
Pada dialog Add Deep Link yang muncul, masukkan info untuk deep link Anda.
Perhatikan hal berikut:
- URI yang tidak memiliki skema dianggap sebagai http atau https. Misalnya,
www.google.com
cocok denganhttp://www.google.com
danhttps://www.google.com
. - Placeholder parameter jalur dalam bentuk
{placeholder_name}
cocok dengan satu atau beberapa karakter. Misalnya,http://www.example.com/users/{id}
cocok denganhttp://www.example.com/users/4
. Komponen navigasi mencoba mengurai nilai placeholder menjadi jenis yang sesuai dengan mencocokkan nama placeholder dengan argumen yang ditentukan untuk tujuan deep link. Jika tidak ada argumen yang ditentukan dengan nama yang sama, jenisString
default digunakan untuk nilai argumen. Anda dapat menggunakan karakter pengganti .* untuk mencocokkan 0 atau beberapa karakter. - Placeholder parameter kueri dapat digunakan sebagai pengganti atau bersama dengan
parameter lokasi. Misalnya,
http://www.example.com/users/{id}?myarg={myarg}
cocok denganhttp://www.example.com/users/4?myarg=28
. - Placeholder parameter kueri untuk variabel yang ditentukan dengan nilai default atau
nullable tidak perlu cocok. Misalnya,
http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2}
cocok denganhttp://www.example.com/users/4?arg2=28
atauhttp://www.example.com/users/4?arg1=7
. Hal ini tidak berlaku untuk parameter jalur. Misalnya,http://www.example.com/users?arg1=7&arg2=28
tidak cocok dengan pola di atas karena parameter jalur yang diperlukan tidak diberikan. - Parameter kueri yang tidak relevan tidak memengaruhi pencocokan URI deep link. Misalnya,
http://www.example.com/users/{id}
cocok denganhttp://www.example.com/users/4?extraneousParam=7
, meskipunextraneousParam
tidak ditetapkan dalam pola URI.
- URI yang tidak memiliki skema dianggap sebagai http atau https. Misalnya,
(Opsional) Centang Auto Verify untuk meminta Google memverifikasi bahwa Anda adalah pemilik URI. Untuk informasi selengkapnya, lihat Memverifikasi Link Aplikasi Android.
Klik Add. Ikon link muncul di atas tujuan yang dipilih untuk menunjukkan bahwa tujuan memiliki deep link.
Klik tab Code untuk beralih ke tampilan XML. Elemen
<deepLink>
yang dibuat bertingkat telah ditambahkan ke tujuan:<deepLink app:uri="https://www.google.com" />
Untuk mengaktifkan deep link implisit, Anda juga harus memberikan tambahan untuk file
manifest.xml
aplikasi. Tambahkan satu elemen <nav-graph>
ke aktivitas
yang mengarah ke grafik navigasi yang ada, seperti yang ditunjukkan dalam contoh berikut:
<?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>
Saat membuat project Anda, komponen Navigasi akan mengganti elemen <nav-graph>
dengan elemen <intent-filter>
yang dibuat untuk mencocokkan semua deep link
dalam grafik navigasi.
Saat memicu deep link implisit, status data sebelumnya bergantung pada
apakah Intent
implisit diluncurkan dengan
tanda
Intent.FLAG_ACTIVITY_NEW_TASK
:
- Jika tanda ini ditentukan, data tugas sebelumnya akan dihapus dan diganti dengan
tujuan deep link. Seperti pada deep link eksplisit, saat
membuat grafik bertingkat,
tujuan awal setiap level pembuatan grafik bertingkat, yaitu tujuan awal
setiap elemen
<navigation>
di hierarki, juga akan ditambahkan ke stack. Ini berarti saat menekan tombol Kembali dari tujuan deep link, pengguna akan kembali ke stack navigasi seolah-olah mereka memasuki aplikasi Anda dari titik masuknya. - Jika tanda tidak ditentukan, Anda tetap berada di stack tugas aplikasi sebelumnya tempat deep link implisit dipicu. Dalam hal ini, tombol Kembali akan mengembalikan Anda ke aplikasi sebelumnya, sedangkan tombol Atas akan memulai tugas aplikasi pada tujuan induk hierarkis dalam grafik navigasi Anda.
Menangani deep link
Sangat disarankan untuk selalu menggunakan launchMode
default dari standard
saat
menggunakan Navigasi. Saat menggunakan mode peluncuran standard
, Navigasi
akan otomatis menangani deep link dengan memanggil
handleDeepLink()
untuk memproses deep link eksplisit atau implisit dalam Intent
. Namun,
hal ini tidak terjadi secara otomatis jika Activity
digunakan kembali saat menggunakan
launchMode
alternatif seperti singleTop
. Dalam hal ini, Anda perlu memanggil
handleDeepLink()
secara manual di onNewIntent()
, seperti yang ditunjukkan dalam
contoh berikut:
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); }
Referensi lainnya
Untuk mempelajari navigasi lebih lanjut, lihat referensi berikut.