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

ใน 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>

คุณยังสามารถใช้เครื่องมือแก้ไขการนำทางเพื่อสร้างลิงก์ในรายละเอียดโดยนัยไปยัง ดังนี้

  1. ในแท็บการออกแบบของตัวแก้ไขการนำทาง ให้เลือกปลายทางสำหรับ Deep Link
  2. คลิก + ในส่วนลิงก์ในรายละเอียดของแผงแอตทริบิวต์
  3. ในกล่องโต้ตอบเพิ่ม 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. คลิกเพิ่ม ไอคอนลิงก์ ปรากฏเหนือปลายทางที่เลือกเพื่อระบุว่าปลายทางมี ลิงก์ในรายละเอียด

  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 ทั้งหมด ในกราฟการนำทาง

เมื่อทริกเกอร์ 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);
}

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

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

ตัวอย่าง

Codelab

วิดีโอ