Resep BackStack Sintetis Deep Link
Resep ini menunjukkan cara menerapkan prinsip navigasi dalam konteks deep link dengan mengelola backStack sintetis dan tumpukan Tugas.
Struktur Resep
Resep ini menyimulasikan skenario dunia nyata saat "Aplikasi A" melakukan deep link ke "Aplikasi B".
"App A" disimulasikan oleh modul syntheticbackstack, yang
berisi SyntheticBackStackDeepLinkActivity yang memungkinkan Anda membuat intent deep link dan
memicunya di Tugas yang ada, atau di Tugas baru.
"App B" disimulasikan oleh modul syntheticbackstackapp, yang berisi
SyntheticBackStackAppActivity yang Anda buka dengan deep link. Modul tersebut menunjukkan cara membuat backStack sintetis dan cara mengelola stack Tugas dengan benar untuk mendukung tombol Kembali dan Naik.
Cara Menggunakan
Pastikan app dan syntheticbackstackapp utama diinstal di emulator atau perangkat terhubung. Pastikan syntheticbackstackapp yang terinstal mendukung link "www.nav3deeplink.com".
Di halaman landing resep, pilih filter dan klik tombol untuk membuat deep link. Anda akan diarahkan ke Aktivitas syntheticbackstackapp.
Cara Kerja
Resep ini mengikuti panduan deep link yang diringkas di sini.
Untuk melihat perilaku Existing Task:
- Membuka deep link menggunakan tugas saat ini
- Di perangkat, geser ke atas untuk melihat semua aplikasi terbaru
- Perhatikan bahwa Aktivitas baru dibuka dalam aplikasi Nav3Recipes
- Klik tombol kembali untuk kembali ke Aktivitas asli
- Ulangi langkah 1
- Klik tombol atas untuk membuka layar induk
- Di perangkat, geser ke atas untuk melihat semua aplikasi terbaru
- Perhatikan bahwa Aktivitas baru kini dibuka dalam aplikasi Nav3SyntheticBackStack
Untuk melihat perilaku New Task:
- Membuka deep link menggunakan tugas baru
- Di perangkat, geser ke atas untuk melihat semua aplikasi terbaru
- Perhatikan bahwa Aktivitas baru dibuka dalam aplikasi Nav3SyntheticBackStack
- Klik tombol Atas atau Kembali untuk membuka layar induk
Penerapan inti
Fungsi helper inti untuk navigateUp dan membangun backStack sintetis dapat ditemukan di sini
Baca Lebih Lanjut
Lihat panduan deep link untuk mendapatkan panduan komprehensif tentang prinsip Deep linking dan cara menerapkannya di Navigation 3.
package com.example.nav3recipes.deeplink.handlerequests.syntheticbackstack import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.core.net.toUri import androidx.lifecycle.compose.dropUnlessResumed import com.example.nav3recipes.common.deeplink.EntryScreen import com.example.nav3recipes.common.deeplink.LIST_FIRST_NAMES import com.example.nav3recipes.common.deeplink.LIST_LOCATIONS import com.example.nav3recipes.common.deeplink.MenuDropDown import com.example.nav3recipes.common.deeplink.PaddedButton import com.example.nav3recipes.common.deeplink.TextContent import com.example.nav3recipes.ui.setEdgeToEdgeConfig internal const val ADVANCED_PATH_BASE = "https://www.nav3deeplink.com" /** * The recipe entry point that allows users to create a deep link and make a request with it. * * **HOW THIS RECIPE WORKS** This recipe simulates a real-world scenario where "App A" deep links * into "App B". * * "App A" is simulated by this current module `syntheticbackstack`, which * contains the [SyntheticBackStackDeepLinkActivity] that allows you to create a deeplink intent and * trigger that in either the existing Task, or in a new Task. * * "App B" is simulated by the module `syntheticbackstackapp`, which contains * the SyntheticBackStackAppActivity that you deeplink into. That module shows you how to build a synthetic backStack * and how to manage the Task stack properly in order to support both Back and Up buttons. * * See the [README](README.md) file of current module for more info on advanced deep linking. */ class SyntheticBackStackDeepLinkActivity: ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { setEdgeToEdgeConfig() super.onCreate(savedInstanceState) setContent { EntryScreen("Sandbox - Build Your Deeplink Intent") { val initFirstName = MENU_OPTIONS_FIRST_NAME.values.first().first() val initLocation = MENU_OPTIONS_LOCATION.values.last().first() val initTaskStack = MENU_OPTIONS_TASK_STACK.values.first().first() var firstName by remember { mutableStateOf(initFirstName) } var location by remember { mutableStateOf(initLocation) } var taskStack by remember { mutableStateOf(initTaskStack) } // select first name MenuDropDown( menuOptions = MENU_OPTIONS_FIRST_NAME, ) { _, selected -> firstName = selected } // select first name MenuDropDown( menuOptions = MENU_OPTIONS_LOCATION, ) { _, selected -> location = selected } // select current task stack or build new task stack MenuDropDown( menuOptions = MENU_OPTIONS_TASK_STACK, ) { _, selected -> taskStack = selected } // build final deeplink URL and Intent val finalUrl = "${ADVANCED_PATH_BASE}/user/$firstName/$location" // display Intent info val flagString = if (taskStack == TAG_NEW_TASK) { "Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK" } else "<none>" val intentString = """ | Final Intent: | data = "$finalUrl" | action = Intent.ACTION_VIEW | flags = $flagString """.trimMargin() TextContent(intentString) // deeplink to target PaddedButton("Deeplink Away!", onClick = dropUnlessResumed { val intent = Intent().apply { data = finalUrl.toUri() action = Intent.ACTION_VIEW if (taskStack == TAG_NEW_TASK) { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } } startActivity(intent) }) } } } } private const val TAG_FIRST_NAME = "firstName" private const val TAG_LOCATION = "location" private const val TAG_TASK_STACK = "Task stack" private const val TAG_CURRENT_TASK = "Use Current Task Stack" private const val TAG_NEW_TASK = "Start New Task Stack" private val MENU_OPTIONS_FIRST_NAME = mapOf( TAG_FIRST_NAME to LIST_FIRST_NAMES ) private val MENU_OPTIONS_LOCATION = mapOf( TAG_LOCATION to LIST_LOCATIONS ) private val MENU_OPTIONS_TASK_STACK = mapOf( TAG_TASK_STACK to listOf(TAG_CURRENT_TASK, TAG_NEW_TASK), )