وصفة "الربط بصفحة معيّنة" باستخدام ميزة "الرجوع إلى الخلف" الاصطناعية
توضّح هذه الوصفة كيفية تطبيق مبادئ التنقّل في سياق "الربط بصفحة معيّنة" من خلال إدارة ميزة "الرجوع إلى الخلف" الاصطناعية ومجموعات المهام.
بنية الوصفة
تحاكي هذه الوصفة سيناريو واقعيًا يتم فيه "الربط بصفحة معيّنة" من "التطبيق أ" إلى "التطبيق ب".
يحاكي الوحدة syntheticbackstack "التطبيق أ"، والتي
تحتوي على SyntheticBackStackDeepLinkActivity التي تتيح لك إنشاء هدف "الربط بصفحة معيّنة" و
تفعيله إما في المهمة الحالية أو في مهمة جديدة.
يحاكي الوحدة syntheticbackstackapp "التطبيق ب"، وتحتوي هذه الوحدة على
SyntheticBackStackAppActivity التي يتم "الربط بصفحة معيّنة" إليها. توضّح لك هذه الوحدة كيفية إنشاء ميزة "الرجوع إلى الخلف" الاصطناعية وكيفية إدارة مجموعة المهام بشكلٍ صحيح من أجل دعم الزرّين "رجوع" و"أعلى".
كيفية الاستخدام
تأكَّد من تثبيت كل من app وsyntheticbackstackapp على المحاكي أو الجهاز المتصل. تأكَّد من أنّ syntheticbackstackapp المثبَّت يتوافق مع
الرابط "www.nav3deeplink.com".
في الصفحة المقصودة للوصفة، اختَر الفلاتر وانقر على الزر "الربط بصفحة معيّنة". من المفترض أن ينتقل بك ذلك إلى النشاط syntheticbackstackapp.
طريقة العمل
يتّبع الإعداد المسبق إرشادات "الربط العميق" التي تم تلخيصها هنا.
للاطّلاع على سلوك Existing Task
- افتح "الربط بصفحة معيّنة" باستخدام المهمة الحالية
- على الجهاز، مرِّر سريعًا للأعلى للاطّلاع على جميع التطبيقات الأخيرة
- لاحظ أنّ النشاط الجديد يتم فتحه ضمن تطبيق Nav3Recipes
- انقر على زر الرجوع للرجوع إلى النشاط الأصلي
- كرِّر الخطوة 1
- انقر على الزر "أعلى" للانتقال إلى الشاشة الرئيسية
- على الجهاز، مرِّر سريعًا للأعلى للاطّلاع على جميع التطبيقات الأخيرة
- لاحظ أنّ النشاط الجديد يتم فتحه الآن ضمن تطبيق Nav3SyntheticBackStack
للاطّلاع على سلوك New Task
- افتح "الربط بصفحة معيّنة" باستخدام مهمة جديدة
- على الجهاز، مرِّر سريعًا للأعلى للاطّلاع على جميع التطبيقات الأخيرة
- لاحظ أنّ النشاط الجديد يتم فتحه ضمن تطبيق Nav3SyntheticBackStack
- انقر على الزر "أعلى" أو "رجوع" للانتقال إلى الشاشة الرئيسية
التنفيذ الأساسي
يمكنك العثور هنا على الدوال المساعدة الأساسية لـ navigateUp وإنشاء ميزة "الرجوع إلى الخلف" الاصطناعية يمكن العثور عليها هنا
محتوى إضافي للقراءة
اطّلِع على دليل "الربط بصفحة معيّنة" للحصول على دليل شامل حول مبادئ "الربط بصفحة معيّنة" وكيفية تطبيقها في 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), )