สูตร URI แบบคงที่ของ Deep Link
สูตรนี้แสดงวิธีทำ Deep Link ด้วย URI แบบคงที่
คอมโพเนนต์ของสูตร
สูตรนี้มี 2 กิจกรรม ได้แก่
StaticUriDeepLinkActivityเพื่อสร้างและเริ่ม Intent ด้วย URI ของ Deep LinkMainActivityเป็นกิจกรรมเป้าหมายของ Deep Link ซึ่งแสดงถึงแอปที่ผู้ใช้สามารถทำ Deep Link ไปได้
วิธีทำงานของ Deep Link ที่แสดง
- แหล่งที่มาของ Deep Link (
StaticUriDeepLinkActivity) จะกำหนด URI และสร้าง Intent เพื่อทำ Deep Link - แอป (
MainActivity) จะประกาศคีย์การนำทาง (HomeKey) และประกาศUriDeepLinkMatcherพร้อมกับตัวซีเรียลไลซ์HomeKeyรวมถึงรูปแบบ URI ที่HomeKeyรองรับ เพื่อระบุว่าHomeKeyรองรับการทำ Deep Link MainActivityonCreate จะสร้างอินสแตนซ์DeepLinkRequestด้วย Intent และจับคู่กับUriDeepLinkMatcherเพื่อรับMatchResultหากMatchResultไม่เป็นค่าว่าง แอปจะไปยังคีย์ที่แสดงผลโดยผลลัพธ์ มิเช่นนั้น ระบบจะไม่รองรับ Deep Link และแอปจะไปยังหน้าจอFallback
package com.example.nav3recipes.deeplink.handlerequests.staticuri import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.core.net.toUri import androidx.lifecycle.compose.dropUnlessResumed import com.example.nav3recipes.common.deeplink.EntryScreen import com.example.nav3recipes.common.deeplink.PaddedButton import com.example.nav3recipes.common.deeplink.TextContent import com.example.nav3recipes.deeplink.handlerequests.uriarguments.ui.PATH_BASE import com.example.nav3recipes.ui.setEdgeToEdgeConfig const val HOME_URI = "$PATH_BASE/home" class StaticUriDeepLinkActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { setEdgeToEdgeConfig() super.onCreate(savedInstanceState) setContent { EntryScreen("Deep link url:") { TextContent(HOME_URI) PaddedButton("Deeplink Away!", onClick = dropUnlessResumed { val intent = Intent( this@StaticUriDeepLinkActivity, MainActivity::class.java ) // the uri to deep link with intent.data = HOME_URI.toUri() startActivity(intent) }) } } } }
package com.example.nav3recipes.deeplink.handlerequests.staticuri import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.navigation3.runtime.NavBackStack import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.ui.NavDisplay import com.example.nav3recipes.common.deeplink.EntryScreen import com.example.nav3recipes.common.deeplink.TextContent import com.example.nav3recipes.deeplink.handlerequests.uriarguments.HomeKey import com.example.nav3recipes.deeplink.handlerequests.uriarguments.NavRecipeKey import androidx.navigation3.runtime.deeplink.DeepLinkRequest import androidx.navigation3.runtime.deeplink.DeepLinkUri import androidx.navigation3.runtime.deeplink.UriDeepLinkMatcher import androidx.navigation3.runtime.deeplink.invoke import com.example.nav3recipes.ui.setEdgeToEdgeConfig import kotlinx.serialization.Serializable import kotlinx.serialization.serializer @Serializable internal object FallbackKey: NavRecipeKey { override val name: String = "Fallback Key" } class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { setEdgeToEdgeConfig() super.onCreate(savedInstanceState) // create a DeepLinkRequest with the intent val request = DeepLinkRequest(intent) // try to match DeepLinkRequest to a DeepLinkMatcher val matchResult = HOME_MATCHER.match(request) val key = matchResult?.key ?: FallbackKey /** * Then pass starting key to backstack */ setContent { val backStack: NavBackStack<NavKey> = rememberNavBackStack(key) NavDisplay( backStack = backStack, onBack = { backStack.removeLastOrNull() }, entryProvider = entryProvider { entry<HomeKey> { key -> EntryScreen(key.name) { TextContent("Deep linked to Home") } } entry<FallbackKey> { key -> EntryScreen("${key.name} ") { TextContent( "Failed to deep link - DeepLinkRequest " + "did not match with any DeepLinkMatcher" ) } } } ) } } } /** * Each matcher is associated with a navigation key that supports this deep link. * * A navigation key can be associated with multiple DeepLinkMatchers if it supports more than one deep link. */ private val HOME_MATCHER = UriDeepLinkMatcher( uriPattern = DeepLinkUri(HOME_URI), serializer = serializer<HomeKey>(), )