สร้าง Deep Link สำหรับปลายทาง

ใน 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 ที่ไม่ระบุแหล่งที่มาไปยังปลายทางได้ ดังนี้

  1. ในแท็บออกแบบของตัวแก้ไขการนําทาง ให้เลือกปลายทางสําหรับ Deep Link
  2. คลิก + ในส่วนลิงก์ในรายละเอียดของแผงแอตทริบิวต์
  3. ในกล่องโต้ตอบเพิ่ม 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 ก็ตาม
  4. (ไม่บังคับ) เลือกยืนยันอัตโนมัติเพื่อให้ Google ยืนยันว่าคุณเป็นเจ้าของ URI โปรดดูข้อมูลเพิ่มเติมที่หัวข้อยืนยัน Android App Link

  5. คลิกเพิ่ม ไอคอนลิงก์ จะปรากฏเหนือปลายทางที่เลือกเพื่อระบุว่าปลายทางนั้นๆ มี Deep Link

  6. คลิกแท็บโค้ดเพื่อสลับเป็นมุมมอง 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);
}

แหล่งข้อมูลเพิ่มเติม

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการนำทาง โปรดดูแหล่งข้อมูลต่อไปนี้

ตัวอย่าง

Codelabs

วิดีโอ