Membuat deep link untuk sebuah tujuan

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:

  1. Di tab Design pada Navigation Editor, pilih tujuan untuk deep link.
  2. Klik + di bagian Deep Links pada panel Attributes.
  3. 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 dengan http://www.google.com dan https://www.google.com.
    • Placeholder parameter jalur dalam bentuk {placeholder_name} cocok dengan satu atau beberapa karakter. Misalnya, http://www.example.com/users/{id} cocok dengan http://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, jenis String 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 dengan http://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 dengan http://www.example.com/users/4?arg2=28 atau http://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 dengan http://www.example.com/users/4?extraneousParam=7, meskipun extraneousParam tidak ditetapkan dalam pola URI.
  4. (Opsional) Centang Auto Verify untuk meminta Google memverifikasi bahwa Anda adalah pemilik URI. Untuk informasi selengkapnya, lihat Memverifikasi Link Aplikasi Android.

  5. Klik Add. Ikon link muncul di atas tujuan yang dipilih untuk menunjukkan bahwa tujuan memiliki deep link.

  6. 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.

Codelab

Video