ใน Android นั้น Deep Link คือลิงก์ที่นำคุณไปยังปลายทางที่เฉพาะเจาะจงภายในแอปโดยตรง
คอมโพเนนต์การนําทางช่วยให้คุณสร้าง Deep Link ได้ 2 ประเภท ได้แก่ แบบระบุและแบบไม่ระบุ
สร้าง Explicit Deep Link
Explicit Deep Link คืออินสแตนซ์เดียวของ Deep Link ที่ใช้ PendingIntent
เพื่อนำผู้ใช้ไปยังตำแหน่งที่เจาะจงภายในแอป คุณอาจแสดง Deep Link ที่อาจไม่เหมาะสมเป็นส่วนหนึ่งของการแจ้งเตือนหรือวิดเจ็ตของแอป เป็นต้น
เมื่อผู้ใช้เปิดแอปผ่าน Deep Link ที่ชัดแจ้ง ระบบจะล้างสแต็กงานย้อนกลับและแทนที่ด้วยปลายทางของ Deep Link เมื่อฝังกราฟ ระบบจะเพิ่มปลายทางเริ่มต้นจากแต่ละระดับของการฝังลงในกองด้วย ซึ่งก็คือปลายทางเริ่มต้นจากองค์ประกอบ <navigation>
แต่ละรายการในลําดับชั้น
ซึ่งหมายความว่าเมื่อผู้ใช้กดปุ่ม "ย้อนกลับ" จากปลายทางของ Deep Link ระบบจะนำผู้ใช้กลับไปยังกองการนำทางเหมือนกับว่าผู้ใช้เข้าสู่แอปจากจุดแรกเข้า
คุณใช้คลาส NavDeepLinkBuilder
เพื่อสร้าง PendingIntent
ได้ดังที่แสดงในตัวอย่างด้านล่าง โปรดทราบว่าหากบริบทที่ระบุไม่ใช่ Activity
ตัวสร้างคอนสตรัคเตอร์จะใช้ PackageManager.getLaunchIntentForPackage()
เป็นกิจกรรมเริ่มต้นที่จะเปิดใช้งาน (หากมี)
Kotlin
val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .createPendingIntent()
Java
PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .createPendingIntent();
โดยค่าเริ่มต้น NavDeepLinkBuilder
จะเปิด Deep Link ที่ชัดเจนของคุณในActivity
การเปิดเริ่มต้นที่ประกาศไว้ในไฟล์ Manifest ของแอป หาก NavHost
อยู่ในกิจกรรมอื่น คุณต้องระบุชื่อคอมโพเนนต์เมื่อสร้างเครื่องมือสร้าง Deep Link
Kotlin
val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(DestinationActivity::class.java) .createPendingIntent()
Java
PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(DestinationActivity.class) .createPendingIntent();
หากมี ComponentName
ให้ส่งต่อไปยังผู้สร้างโดยตรงโดยทำดังนี้
Kotlin
val componentName = ... val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(componentName) .createPendingIntent()
Java
ComponentName componentName = ...; PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(componentName) .createPendingIntent();
หากมี NavController
อยู่แล้ว คุณก็สร้าง Deep Link ได้โดยใช้ NavController.createDeepLink()
สร้าง Deep Link แบบไม่เจาะจงปลายทาง
Deep Link ที่ไม่ระบุหมายถึงปลายทางที่เฉพาะเจาะจงในแอป เมื่อเรียกใช้ Deep Link เช่น เมื่อผู้ใช้คลิกลิงก์ Android จะเปิดแอปไปยังปลายทางที่เกี่ยวข้องได้
Deep Link สามารถจับคู่ตาม URI, Intent Action และประเภท MIME คุณสามารถระบุประเภทการทำงานของคีย์เวิร์ดหลายประเภทสําหรับ Deep Link รายการเดียวได้ แต่โปรดทราบว่าระบบจะจัดลําดับความสําคัญของการจับคู่อาร์กิวเมนต์ URI ก่อน ตามด้วยการดำเนินการ แล้วตามด้วยประเภท MIME
ตัวอย่าง Deep Link ที่มี URI, การดําเนินการ และประเภท MIME มีดังนี้
<fragment android:id="@+id/a"
android:name="com.example.myapplication.FragmentA"
tools:layout="@layout/a">
<deepLink app:uri="www.example.com"
app:action="android.intent.action.MY_ACTION"
app:mimeType="type/subtype"/>
</fragment>
นอกจากนี้ คุณยังใช้เครื่องมือแก้ไขการนําทางเพื่อสร้าง Deep Link ที่ไม่ระบุแหล่งที่มาไปยังปลายทางได้ ดังนี้
- ในแท็บออกแบบของตัวแก้ไขการนําทาง ให้เลือกปลายทางสําหรับ Deep Link
- คลิก + ในส่วนลิงก์ในรายละเอียดของแผงแอตทริบิวต์
ในกล่องโต้ตอบเพิ่ม Deep Link ที่ปรากฏขึ้น ให้ป้อนข้อมูลสำหรับ Deep Link
ข้อควรทราบ
- URI ที่ไม่มีรูปแบบจะถือว่าเป็น http หรือ https เช่น
www.google.com
จะจับคู่กับทั้งhttp://www.google.com
และhttps://www.google.com
- ตัวยึดตําแหน่งพารามิเตอร์เส้นทางในรูปแบบ
{placeholder_name}
จะจับคู่กับอักขระอย่างน้อย 1 ตัว เช่นhttp://www.example.com/users/{id}
ตรงกับhttp://www.example.com/users/4
คอมโพเนนต์การนำทางจะพยายามแยกวิเคราะห์ค่าตัวยึดตำแหน่งเป็นประเภทที่เหมาะสมด้วยการจับคู่ชื่อตัวยึดตำแหน่งกับอาร์กิวเมนต์ที่กำหนดไว้สำหรับปลายทางของ Deep Link หากไม่ได้กําหนดอาร์กิวเมนต์ที่มีชื่อเดียวกัน ระบบจะใช้ประเภทString
เริ่มต้นสําหรับค่าอาร์กิวเมนต์ คุณสามารถใช้ไวลด์การ์ด .* เพื่อจับคู่อักขระตั้งแต่ 0 ตัวขึ้นไปได้ - ตัวยึดตําแหน่งพารามิเตอร์การค้นหาสามารถใช้แทนหรือร่วมกับพารามิเตอร์เส้นทางได้ เช่น
http://www.example.com/users/{id}?myarg={myarg}
ตรงกับhttp://www.example.com/users/4?myarg=28
- ตัวยึดตําแหน่งพารามิเตอร์การค้นหาสําหรับตัวแปรที่กําหนดค่าเริ่มต้นหรือค่าที่อนุญาตค่า Null ไม่จำเป็นต้องตรงกัน ตัวอย่างเช่น
http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2}
ตรงกับhttp://www.example.com/users/4?arg2=28
หรือhttp://www.example.com/users/4?arg1=7
แต่จะไม่ใช้กับพารามิเตอร์เส้นทาง ตัวอย่างเช่นhttp://www.example.com/users?arg1=7&arg2=28
ไม่ตรงกับรูปแบบข้างต้น เนื่องจากไม่ได้ระบุพารามิเตอร์เส้นทางที่จำเป็น - พารามิเตอร์การค้นหาที่ไม่เกี่ยวข้องจะไม่ส่งผลต่อการจับคู่ URI ของ Deep Link เช่น
http://www.example.com/users/{id}
ตรงกับhttp://www.example.com/users/4?extraneousParam=7
แม้ว่าจะไม่ได้กำหนดextraneousParam
ในรูปแบบ URI ก็ตาม
- URI ที่ไม่มีรูปแบบจะถือว่าเป็น http หรือ https เช่น
(ไม่บังคับ) เลือกยืนยันอัตโนมัติเพื่อให้ Google ยืนยันว่าคุณเป็นเจ้าของ URI โปรดดูข้อมูลเพิ่มเติมที่หัวข้อยืนยัน Android App Link
คลิกเพิ่ม ไอคอนลิงก์ จะปรากฏเหนือปลายทางที่เลือกเพื่อระบุว่าปลายทางนั้นๆ มี Deep Link
คลิกแท็บโค้ดเพื่อสลับเป็นมุมมอง XML ระบบเพิ่มองค์ประกอบ
<deepLink>
ที่ฝังไว้ไปยังปลายทางแล้ว<deepLink app:uri="https://www.google.com" />
หากต้องการเปิดใช้การทำ Deep Link โดยนัย คุณต้องเพิ่มข้อมูลลงในไฟล์ manifest.xml
ของแอปด้วย เพิ่มองค์ประกอบ <nav-graph>
รายการเดียวลงในกิจกรรมที่ชี้ไปยังกราฟการนําทางที่มีอยู่ ดังที่แสดงในตัวอย่างต่อไปนี้
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <application ... > <activity name=".MainActivity" ...> ... <nav-graph android:value="@navigation/nav_graph" /> ... </activity> </application> </manifest>
เมื่อสร้างโปรเจ็กต์ คอมโพเนนต์การนําทางจะแทนที่องค์ประกอบ <nav-graph>
ด้วยองค์ประกอบ <intent-filter>
ที่สร้างขึ้นเพื่อให้ตรงกับ Deep Link ทั้งหมดในกราฟการนําทาง
เมื่อทริกเกอร์ Implicit Deep Link สถานะของกองซ้อนที่ซ้อนกันอยู่จะขึ้นอยู่กับว่ามีการเปิดตัว Intent
ที่ไม่ระบุโดยชัดแจ้งด้วย Flag Intent.FLAG_ACTIVITY_NEW_TASK
หรือไม่
- หากตั้งค่า Flag ระบบจะล้างกองซ้อนงานย้อนกลับและแทนที่ด้วยปลายทางของ Deep Link เมื่อฝังกราฟ ระบบจะเพิ่มปลายทางเริ่มต้นจากแต่ละระดับของการฝัง (นั่นคือ ปลายทางเริ่มต้นจากองค์ประกอบ
<navigation>
แต่ละรายการในลําดับชั้น) ลงในกองด้วย เช่นเดียวกับการทำ Deep Link อย่างชัดแจ้ง ซึ่งหมายความว่าเมื่อผู้ใช้กดปุ่ม "ย้อนกลับ" จากปลายทางของ Deep Link ระบบจะนำผู้ใช้กลับไปยังกองการนำทางเหมือนกับว่าผู้ใช้เข้าสู่แอปจากจุดแรกเข้า - หากไม่ได้ตั้งค่า Flag ไว้ คุณจะยังคงอยู่ในกองงานของแอปก่อนหน้า ซึ่งเป็นจุดที่เรียกใช้ Deep Link ที่ไม่ระบุ ในกรณีนี้ ปุ่มกลับจะนำคุณกลับไปยังแอปก่อนหน้า ในขณะที่ปุ่มขึ้นจะเริ่มงานของแอปบนปลายทางระดับบนสุดที่เป็นลำดับชั้นภายในกราฟการนำทาง
การจัดการ Deep Link
เราขอแนะนําอย่างยิ่งให้ใช้ launchMode
เริ่มต้นของ standard
เสมอเมื่อใช้การนําทาง เมื่อใช้โหมดเปิด standard
การนำทางจะจัดการ Deep Link โดยอัตโนมัติโดยการเรียกใช้ handleDeepLink()
เพื่อประมวลผล Deep Link อย่างชัดเจนหรือโดยนัยภายใน Intent
อย่างไรก็ตาม ระบบจะไม่ทำเช่นนี้โดยอัตโนมัติหากมีการใช้ Activity
ซ้ำเมื่อใช้ launchMode
อื่น เช่น singleTop
ในกรณีนี้ คุณจะต้องเรียกใช้ handleDeepLink()
ด้วยตนเองใน onNewIntent()
ดังที่แสดงในตัวอย่างต่อไปนี้
Kotlin
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) navController.handleDeepLink(intent) }
Java
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); navController.handleDeepLink(intent); }
แหล่งข้อมูลเพิ่มเติม
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการนำทาง โปรดดูแหล่งข้อมูลต่อไปนี้