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.