Derin Bağlantı Yapay Geriye Yönelik Görev Yığını Tarifi
Bu tarifte, sentetik backStack ve Görev yığınlarını yöneterek derin bağlantılar bağlamında gezinme ilkelerinin nasıl uygulanacağı gösterilmektedir.
Yemek Tarifi Yapısı
Bu tarif, "Uygulama A"nın "Uygulama B"ye derin bağlantı verdiği gerçek hayattaki bir senaryoyu simüle eder.
"A uygulaması", syntheticbackstack modülü tarafından simüle edilir. Bu modül, derin bağlantı amacı oluşturmanıza ve bunu mevcut görevde ya da yeni bir görevde tetiklemenize olanak tanıyan SyntheticBackStackDeepLinkActivity öğesini içerir.
"Uygulama B", derin bağlantı oluşturduğunuz SyntheticBackStackAppActivity öğesini içeren syntheticbackstackapp modülü tarafından simüle edilir. Bu modülde, hem Geri hem de Yukarı düğmelerini desteklemek için nasıl yapay bir backStack oluşturacağınız ve Görev yığınını nasıl düzgün şekilde yöneteceğiniz gösterilmektedir.
Nasıl Kullanılır?
Hem ana app uygulamasının hem de syntheticbackstackapp uygulamasının emülatöre veya bağlı cihaza yüklendiğinden emin olun. Yüklenen syntheticbackstackapp uygulamasının "www.nav3deeplink.com" bağlantısını desteklediğinden emin olun.
Tarifin açılış sayfasında filtreleri seçin ve derin bağlantı düğmesini tıklayın. Bu işlem sizi syntheticbackstackapp etkinliğine yönlendirir.
İşleyiş Şekli
Tarif, burada özetlenen derin bağlantı yönergesine uygundur.
Existing Task davranışını görmek için:
- Mevcut görevi kullanarak derin bağlantıyı açma
- Cihazda, son kullanılan tüm uygulamaları görmek için yukarı kaydırın.
- Yeni etkinliğin Nav3Recipes uygulamasında açıldığını fark edin.
- Orijinal Etkinliğe dönmek için geri düğmesini tıklayın.
- 1. adımı tekrarlayın
- Üst ekrana gitmek için yukarı düğmesini tıklayın.
- Cihazda, son kullanılan tüm uygulamaları görmek için yukarı kaydırın.
- Yeni etkinliğin artık Nav3SyntheticBackStack uygulamasında açıldığını fark edin.
New Task davranışını görmek için:
- Yeni görevi kullanarak derin bağlantıyı açma
- Cihazda, son kullanılan tüm uygulamaları görmek için yukarı kaydırın.
- Yeni Etkinliğin Nav3SyntheticBackStack uygulamasında açıldığını fark edin.
- Üst ekrana gitmek için Yukarı veya Geri düğmesini tıklayın.
Temel uygulama
navigateUp ve yapay backStack oluşturmayla ilgili temel yardımcı işlevleri burada bulabilirsiniz.
Daha fazla bilgi
Derin bağlantı ilkeleri ve bunları Navigation 3'te uygulama hakkında kapsamlı bir kılavuz için derin bağlantı kılavuzuna göz atın.
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), )