ใน Android นั้น Deep Link คือลิงก์ที่นำคุณไปยังปลายทางที่เฉพาะเจาะจงภายในแอปโดยตรง
คอมโพเนนต์การนําทางช่วยให้คุณสร้าง Deep Link ได้ 2 ประเภท ได้แก่ แบบระบุและแบบไม่ระบุ
สร้าง Explicit Deep Link
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()
สร้าง Implicit 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 ที่ปรากฏขึ้น ให้ป้อนข้อมูลสำหรับ 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
- ตัวยึดตําแหน่งพารามิเตอร์การค้นหาสําหรับตัวแปรที่กําหนดค่าเริ่มต้นหรือค่าที่อนุญาตค่าว่างไม่จำเป็นต้องตรงกัน เช่น
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); }
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับการนําทางได้ที่แหล่งข้อมูลต่อไปนี้