Recette de pile "Retour" synthétique de lien profond
Cette recette explique comment appliquer les principes de navigation dans le contexte des liens profonds en gérant une pile "Retour" synthétique et des piles de tâches.
Structure de la recette
Cette recette simule un scénario réel dans lequel l'application A dispose d'un lien profond vers l'application B.
L'application A est simulée par le module syntheticbackstack, qui
contient l'élément SyntheticBackStackDeepLinkActivity vous permettant de créer un intent de lien profond et
de le déclencher dans la tâche existante ou dans une nouvelle tâche.
L'application B est simulée par le module syntheticbackstackapp, qui contient
l'élément SyntheticBackStackAppActivity vers lequel vous créez un lien profond. Ce module vous explique comment créer une pile "Retour" synthétique et comment gérer correctement la pile de tâches afin de prendre en charge les boutons "Retour" et "Haut".
Utilisation
Assurez-vous que les applications principales app et syntheticbackstackapp sont installées sur l'émulateur ou l'appareil connecté. Assurez-vous que l'application installée syntheticbackstackapp prend en charge
le "www.nav3deeplink.com" lien.
Sur la page de destination de la recette, choisissez les filtres et cliquez sur le bouton pour créer un lien profond. Vous devriez être redirigé vers l'activité de syntheticbackstackapp.
Fonctionnement
La recette suit les consignes concernant les liens profonds résumées ici.
Pour voir le comportement de Existing Task :
- Ouvrez le lien profond à l'aide de la tâche actuelle.
- Sur l'appareil, balayez l'écran vers le haut pour afficher toutes les applications récentes.
- Notez que la nouvelle activité s'ouvre dans l'application Nav3Recipes.
- Cliquez sur le bouton "Retour" pour revenir à l'activité d'origine.
- Répétez l'étape 1.
- Cliquez sur le bouton "Haut" pour accéder à l'écran parent.
- Sur l'appareil, balayez l'écran vers le haut pour afficher toutes les applications récentes.
- Notez que la nouvelle activité s'ouvre désormais dans l'application Nav3SyntheticBackStack.
Pour voir le comportement de New Task :
- Ouvrez le lien profond à l'aide d'une nouvelle tâche.
- Sur l'appareil, balayez l'écran vers le haut pour afficher toutes les applications récentes.
- Notez que la nouvelle activité s'ouvre dans l'application Nav3SyntheticBackStack.
- Cliquez sur le bouton "Haut" ou "Retour" pour accéder à l'écran parent.
Implémentation de base
Les fonctions d'assistance principales pour navigateUp et la création d'une pile "Retour" synthétique sont disponibles ici
Informations complémentaires
Consultez le guide sur les liens profonds pour obtenir un guide complet sur les principes des liens profonds et sur la manière de les appliquer dans 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), )