ใน Android ลิงก์ในรายละเอียดคือลิงก์ที่จะนำคุณไปยัง ปลายทางภายในแอป
คอมโพเนนต์การนำทางให้คุณสร้าง Deep Link ที่แตกต่างกัน 2 ประเภท ดังนี้ Explicit และ implicit
สร้าง Deep Link ที่อาจไม่เหมาะสม
Explicit Deep Link เป็นอินสแตนซ์เดียว
ของ Deep Link ที่ใช้ PendingIntent
เพื่อนำผู้ใช้ไปยังตำแหน่งที่ต้องการภายในแอป คุณอาจเห็น
Explicit Deep Link เป็นส่วนหนึ่งของการแจ้งเตือนหรือวิดเจ็ตแอป
เป็นต้น
เมื่อผู้ใช้เปิดแอปของคุณผ่าน Deep Link ที่ชัดแจ้ง งาน Back Stack จะ
ถูกล้างและแทนที่ด้วยปลายทางของ 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 แบบไม่เจาะจงปลายทาง
Implicit Deep Link หมายถึง ปลายทางที่เจาะจงในแอป เมื่อมีการเรียกใช้ Deep Link ตัวอย่างเช่น เมื่อผู้ใช้คลิกลิงก์ Android จะสามารถเปิดแอปของคุณไปยังอุปกรณ์ ปลายทาง
คุณสามารถจับคู่ Deep Link ได้ตาม URI, การดำเนินการผ่าน Intent และประเภท MIME คุณสามารถ ระบุประเภทการทำงานของคีย์เวิร์ดหลายประเภทสำหรับ Deep Link 1 รายการ แต่โปรดทราบว่า 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 ที่ปรากฏขึ้น ให้ป้อนข้อมูลสำหรับ ลิงก์ในรายละเอียด
ข้อควรทราบ
- 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
คลิกเพิ่ม ไอคอนลิงก์ ปรากฏเหนือปลายทางที่เลือกเพื่อระบุว่าปลายทางมี ลิงก์ในรายละเอียด
คลิกแท็บโค้ดเพื่อสลับเป็นมุมมอง 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 ทั้งหมด
ในกราฟการนำทาง
เมื่อทริกเกอร์ Deep Link แบบไม่เจาะจงปลายทาง สถานะของ Back Stack จะขึ้นอยู่กับ
Intent
โดยนัยเปิดตัวด้วย
Intent.FLAG_ACTIVITY_NEW_TASK
ธง:
- หากมีการตั้งค่าแฟล็ก ระบบจะล้างสแต็กแบ็กของงานและแทนที่ด้วย
ปลายทาง Deep Link เช่นเดียวกับการทำ Deep Link อย่างชัดแจ้ง เมื่อ
กราฟที่ซ้อนกัน
ปลายทางเริ่มต้นจากการฝังแต่ละระดับ ซึ่งก็คือจุดเริ่มต้น
ปลายทางจากองค์ประกอบ
<navigation>
แต่ละรายการในลำดับชั้นจะเพิ่มลงใน กองซ้อน ซึ่งหมายความว่าเมื่อผู้ใช้กดปุ่ม ย้อนกลับ จาก ปลายทาง ลิงก์ก็กลับขึ้นไปบนสแต็กการนำทางเหมือนแต่เดิม พวกเขาเข้าแอปจากจุดแรกเข้า - หากไม่ได้ตั้งค่าแฟล็ก คุณจะยังอยู่ในสแต็กงานของแอปก่อนหน้า ที่มีการเรียก 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); }
แหล่งข้อมูลเพิ่มเติม
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการนำทาง โปรดดูแหล่งข้อมูลต่อไปนี้