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

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

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

วิดีโอ