Deep Link Synthetic BackStack Recipe
این دستورالعمل نشان میدهد که چگونه اصول پیمایش را در زمینه پیوندهای عمیق با مدیریت یک backStack مصنوعی و پشتههای Task اعمال کنید.
ساختار دستور پخت
این دستورالعمل سناریویی واقعی را شبیهسازی میکند که در آن «برنامه الف» پیوند عمیق به «برنامه ب» میدهد.
«برنامه الف» توسط واحد syntheticbackstack شبیهسازی میشود که
حاوی SyntheticBackStackDeepLinkActivity است که به شما امکان میدهد هدف پیوند عمیق ایجاد کنید و
آن را در «تکلیف» موجود یا در «تکلیف» جدید راهاندازی کنید.
«برنامه B» توسط مدول syntheticbackstackapp شبیهسازی میشود که حاوی
SyntheticBackStackAppActivity است که به آن پیوند عمیق میدهید. این ماژول به شما نشان میدهد که چگونه یک backStack مصنوعی بسازید
و چگونه پشته Task را بهدرستی مدیریت کنید تا از هر دو دکمه «برگشت» و «بالا» پشتیبانی کند.
نحوه استفاده
مطمئن شوید که هر دو app و syntheticbackstackapp اصلی روی شبیهساز یا دستگاه متصل نصب شده باشند. مطمئن شوید syntheticbackstackapp نصبشده از پیوند "www.nav3deeplink.com" پشتیبانی میکند.
در صفحه مقصد دستور پخت، فیلترها را انتخاب کنید و روی دکمه پیوند عمیق کلیک کنید. این کار باید شما را به «فعالیت» syntheticbackstackapp هدایت کند.
روش کار
دستور پخت از رهنمود پیوند عمیق که در اینجا خلاصه شده است پیروی میکند.
برای دیدن رفتار Existing Task:
- باز کردن پیوند عمیق بااستفاده از تکلیف کنونی
- در دستگاه، تند بهبالا بکشید تا همه برنامههای اخیر را ببینید
- توجه کنید که «فعالیت» جدید در برنامه Nav3Recipes باز میشود
- برای برگشتن به «فعالیت» اصلی، روی دکمه برگشتن کلیک کنید
- مرحله ۱ را تکرار کنید
- برای رفتن به صفحه والد، روی دکمه بالا کلیک کنید
- در دستگاه، تند بهبالا بکشید تا همه برنامههای اخیر را ببینید
- توجه داشته باشید که «فعالیت» جدید اکنون در برنامه Nav3SyntheticBackStack باز شده است
برای دیدن رفتار New Task:
- باز کردن پیوند عمیق بااستفاده از تکلیف جدید
- در دستگاه، تند بهبالا بکشید تا همه برنامههای اخیر را ببینید
- توجه داشته باشید که «فعالیت» جدید در برنامه Nav3SyntheticBackStack باز میشود
- برای رفتن به صفحه اصلی، روی دکمه «بالا» یا «برگشت» کلیک کنید
پیادهسازی اصلی
توابع کمکی اصلی برای navigateUp و ساختن backStack مصنوعی را میتوانید اینجا پیدا کنید
خواندن بیشتر
برای دریافت راهنمای جامع درباره اصول پیونددهی عمیق و نحوه اعمال آنها در 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), )