สร้างทางลัด

ทางลัดจะแสดงเนื้อหาบางประเภทแก่ผู้ใช้โดยช่วยให้ผู้ใช้เข้าถึงส่วนต่างๆ ของแอปได้อย่างรวดเร็ว

ความแตกต่างระหว่างทางลัดแอปและทางลัดที่ปักหมุดไว้
รูปที่ 1 ทางลัดของแอปและทางลัดที่ปักหมุดไว้

วิธีนำเสนอเนื้อหาด้วยทางลัดจะขึ้นอยู่กับ Use Case ของคุณ และบริบทของทางลัดนั้นขับเคลื่อนโดยแอปหรือผู้ใช้ แม้ว่าบริบทของทางลัดแบบคงที่จะไม่เปลี่ยนแปลงและบริบทของทางลัดแบบไดนามิกจะเปลี่ยนแปลงอยู่ตลอดเวลา แต่แอปของคุณจะขับเคลื่อนบริบทในทั้ง 2 กรณี ในกรณีที่ผู้ใช้เลือกวิธีที่แอปของคุณนำส่งเนื้อหาให้ตน เช่น ด้วยทางลัดที่ปักหมุดไว้ ผู้ใช้จะเป็นผู้กำหนดบริบท สถานการณ์ต่อไปนี้อธิบายกรณีการใช้งานบางส่วนสำหรับทางลัดแต่ละประเภท

  • ทางลัดแบบคงที่เหมาะที่สุดสำหรับแอปที่ลิงก์ไปยังเนื้อหาโดยใช้โครงสร้างที่สอดคล้องกันตลอดอายุการโต้ตอบของผู้ใช้กับแอป เนื่องจาก Launcher ส่วนใหญ่แสดงทางลัดได้ครั้งละ 4 รายการเท่านั้น ทางลัดแบบคงที่จึงมีประโยชน์สำหรับการทำงานประจำในลักษณะที่สอดคล้องกัน เช่น หากผู้ใช้ต้องการดูปฏิทินหรืออีเมลในลักษณะที่เฉพาะเจาะจง
  • ทางลัดแบบไดนามิกใช้สำหรับการดำเนินการในแอปที่ขึ้นอยู่กับบริบท ทางลัดที่ปรับตามบริบทจะปรับให้เหมาะกับการดำเนินการที่ผู้ใช้ทำในแอป เช่น หากคุณสร้างเกมที่ให้ผู้ใช้เริ่มจากระดับปัจจุบันเมื่อเปิดตัว คุณจะต้องอัปเดตทางลัดบ่อยๆ การใช้ทางลัดแบบไดนามิกช่วยให้คุณอัปเดตทางลัดได้ทุกครั้งที่ผู้ใช้ผ่านด่าน
  • ทางลัดที่ปักหมุดไว้ใช้สำหรับการดำเนินการที่ผู้ใช้เป็นผู้ขับเคลื่อนโดยเฉพาะ เช่น ผู้ใช้อาจต้องการปักหมุดเว็บไซต์ที่เฉพาะเจาะจงไว้ใน Launcher ซึ่งเป็นประโยชน์เนื่องจากช่วยให้ผู้ใช้ดำเนินการที่กำหนดเองได้ เช่น การไปยังเว็บไซต์ในขั้นตอนเดียว ซึ่งรวดเร็วกว่าการใช้อินสแตนซ์เริ่มต้นของเบราว์เซอร์

สร้างทางลัดแบบคงที่

ทางลัดแบบคงที่จะมีลิงก์ไปยังการดำเนินการทั่วไปภายในแอป และการดำเนินการเหล่านี้ต้องสอดคล้องกันตลอดอายุการใช้งานของแอปเวอร์ชันปัจจุบัน ตัวเลือกที่ดีสำหรับทางลัดแบบคงที่ ได้แก่ การดูข้อความที่ส่ง การตั้งปลุก และการแสดงกิจกรรมการออกกำลังกายของผู้ใช้ในวันนั้น

หากต้องการสร้างทางลัดแบบคงที่ ให้ทำดังนี้

  1. ในไฟล์ AndroidManifest.xml ของแอป ให้ค้นหากิจกรรมที่มีการตั้งค่าตัวกรอง Intent เป็นการดำเนินการ android.intent.action.MAIN และหมวดหมู่ android.intent.category.LAUNCHER
  2. เพิ่มองค์ประกอบ <meta-data> ลงในกิจกรรมนี้ซึ่งอ้างอิงไฟล์ทรัพยากรที่มีการกำหนดทางลัดของแอปไว้ ดังนี้

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.myapplication">
      <application ... >
        <activity android:name="Main">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
          <meta-data android:name="android.app.shortcuts"
                     android:resource="@xml/shortcuts" />
        </activity>
      </application>
    </manifest>
    
  3. สร้างไฟล์ทรัพยากรใหม่ชื่อ res/xml/shortcuts.xml

  4. ในไฟล์ทรัพยากรใหม่ ให้เพิ่มองค์ประกอบรูท <shortcuts> ที่มีรายการองค์ประกอบ <shortcut> ในองค์ประกอบ <shortcut> แต่ละรายการ ให้ใส่ข้อมูลเกี่ยวกับทางลัดแบบคงที่ ซึ่งรวมถึงไอคอน ป้ายกำกับคำอธิบาย และ Intent ที่จะเปิดขึ้นภายในแอป ดังนี้

    <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
      <shortcut
        android:shortcutId="compose"
        android:enabled="true"
        android:icon="@drawable/compose_icon"
        android:shortcutShortLabel="@string/compose_shortcut_short_label1"
        android:shortcutLongLabel="@string/compose_shortcut_long_label1"
        android:shortcutDisabledMessage="@string/compose_disabled_message1">
        <intent
          android:action="android.intent.action.VIEW"
          android:targetPackage="com.example.myapplication"
          android:targetClass="com.example.myapplication.Main" />
        <!-- If your shortcut is associated with multiple intents, include them
             here. The last intent in the list determines what the user sees when
             they launch this shortcut. -->
        <categories android:name="android.shortcut.conversation" />
        <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
      </shortcut>
      <!-- Specify more shortcuts here. -->
    </shortcuts>

ปรับแต่งค่าแอตทริบิวต์

รายการต่อไปนี้ประกอบด้วยคำอธิบายสำหรับแอตทริบิวต์ต่างๆ ภายในทางลัดแบบคงที่ ระบุค่าสำหรับ android:shortcutId และ android:shortcutShortLabel ส่วนค่าอื่นๆ ทั้งหมดจะใส่หรือไม่ใส่ก็ได้

android:shortcutId

สตริงลิเทอรัลที่แสดงทางลัดเมื่อออบเจ็กต์ ShortcutManager ดำเนินการกับทางลัดนั้น

android:shortcutShortLabel

วลีสั้นๆ ที่อธิบายวัตถุประสงค์ของทางลัด หากเป็นไปได้ ให้จำกัดคำอธิบายสั้นๆ นี้ไว้ที่ 10 อักขระ

ดูข้อมูลเพิ่มเติมได้ที่ setShortLabel()

android:shortcutLongLabel

วลีแบบขยายที่อธิบายวัตถุประสงค์ของทางลัด หากมีพื้นที่เพียงพอ Launcher จะแสดงค่านี้แทน android:shortcutShortLabel หากเป็นไปได้ ให้จำกัดคำอธิบายแบบยาวนี้ไว้ที่ 25 อักขระ

ดูข้อมูลเพิ่มเติมได้ที่ setLongLabel()

android:shortcutDisabledMessage

ข้อความที่ปรากฏใน Launcher ที่รองรับเมื่อผู้ใช้พยายามเปิดทางลัดที่ปิดใช้ ข้อความต้องอธิบายให้ผู้ใช้ทราบถึงสาเหตุที่ปิดใช้ทางลัด ค่าของแอตทริบิวต์นี้จะไม่มีผลหาก android:enabled เป็น true

android:enabled

กำหนดว่าผู้ใช้จะโต้ตอบกับทางลัดจาก Launcher ที่รองรับได้หรือไม่ ค่าเริ่มต้นของ android:enabled คือ true หากตั้งค่าเป็น false ให้ตั้งค่า android:shortcutDisabledMessage ที่อธิบายเหตุผลที่คุณปิดใช้แป้นพิมพ์ลัด หากคิดว่าไม่จำเป็นต้องแสดงข้อความดังกล่าว ให้นำทางลัดออกจากไฟล์ XML ทั้งหมด

android:icon

บิตแมปหรือไอคอนแบบปรับอัตโนมัติที่ Launcher ใช้เมื่อแสดงทางลัดต่อผู้ใช้ ค่านี้อาจเป็นเส้นทางไปยังรูปภาพหรือไฟล์ทรัพยากรที่มีรูปภาพ ใช้ไอคอนแบบปรับอัตโนมัติเมื่อเป็นไปได้เพื่อปรับปรุงประสิทธิภาพและความสอดคล้อง

กำหนดค่าองค์ประกอบภายใน

ไฟล์ XML ที่แสดงรายการทางลัดแบบคงที่ของแอปจะรองรับองค์ประกอบต่อไปนี้ภายในองค์ประกอบ <shortcut> แต่ละรายการ คุณต้องรวมองค์ประกอบภายใน intent สำหรับทางลัดแบบคงที่แต่ละรายการที่คุณกำหนด

intent

การดำเนินการที่ระบบจะเปิดขึ้นเมื่อผู้ใช้เลือกทางลัด Intent นี้ต้องระบุค่าสำหรับแอตทริบิวต์ android:action

คุณสามารถระบุ Intent หลายรายการสำหรับทางลัดเดียวได้ ดูรายละเอียดได้ที่จัดการ Intent และกิจกรรมหลายรายการ, ตั้งค่า Intent และข้อมูลอ้างอิงคลาส TaskStackBuilder

categories

จัดกลุ่มประเภทการดำเนินการที่ทางลัดของแอปทำ เช่น การสร้างข้อความแชทใหม่

ดูรายการหมวดหมู่ทางลัดที่รองรับได้ที่ข้อมูลอ้างอิงคลาส ShortcutInfo

capability-binding

ประกาศความสามารถที่ลิงก์กับทางลัด

ในตัวอย่างก่อนหน้านี้ ทางลัดจะลิงก์กับความสามารถที่ประกาศไว้สำหรับ CREATE_MESSAGE ซึ่งเป็น Intent ในตัวของ App Actions การเชื่อมโยงความสามารถนี้ช่วยให้ผู้ใช้ใช้คำสั่งเสียงกับ Google Assistant เพื่อเรียกใช้ทางลัดได้

สร้างทางลัดแบบไดนามิก

ทางลัดแบบไดนามิกมีลิงก์ไปยังการดำเนินการที่เจาะจงและคำนึงถึงบริบทภายในแอปของคุณ การดำเนินการเหล่านี้อาจเปลี่ยนแปลงระหว่างการใช้งานแอปและขณะที่แอปทำงานอยู่ ตัวอย่างการใช้งานทางลัดแบบไดนามิกที่ดี ได้แก่ การโทรหาบุคคลที่เฉพาะเจาะจง การนำทางไปยังสถานที่ที่เฉพาะเจาะจง และการโหลดเกมจากจุดบันทึกล่าสุดของผู้ใช้ นอกจากนี้ คุณยังใช้ทางลัดแบบไดนามิกเพื่อเปิดการสนทนาได้ด้วย

ไลบรารี Jetpack ShortcutManagerCompat เป็นตัวช่วยสำหรับ API ShortcutManager ซึ่งช่วยให้คุณจัดการทางลัดแบบไดนามิกในแอปได้ การใช้ไลบรารี ShortcutManagerCompat จะช่วยลดโค้ด Boilerplate และช่วยให้มั่นใจว่าทางลัดจะทำงานได้อย่างสอดคล้องกันใน Android เวอร์ชันต่างๆ นอกจากนี้ ไลบรารีนี้ยังจำเป็นสำหรับการพุชทางลัดแบบไดนามิกเพื่อให้มีสิทธิ์ปรากฏบนแพลตฟอร์มต่างๆ ของ Google เช่น Assistant ด้วยไลบรารีการผสานรวมทางลัดของ Google

ShortcutManagerCompat API ช่วยให้แอปของคุณดำเนินการต่อไปนี้กับทางลัดแบบไดนามิกได้

  • พุชและอัปเดต: ใช้ pushDynamicShortcut() เพื่อเผยแพร่และอัปเดตทางลัดแบบไดนามิก หากมีทางลัดแบบไดนามิกหรือทางลัดที่ปักหมุดไว้ซึ่งมีรหัสเดียวกันอยู่แล้ว ทางลัดที่เปลี่ยนแปลงได้แต่ละรายการจะอัปเดต
  • นำออก: นำชุดทางลัดแบบไดนามิกออกโดยใช้ removeDynamicShortcuts() นำทางลัดแบบไดนามิกทั้งหมดออกโดยใช้ removeAllDynamicShortcuts()

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

ต่อไปนี้เป็นตัวอย่างการสร้างทางลัดแบบไดนามิกและเชื่อมโยงกับแอปของคุณ

val shortcut = ShortcutInfoCompat.Builder(context, "id1")
    .setShortLabel("Website")
    .setLongLabel("Open the website")
    .setIcon(IconCompat.createWithResource(context, R.drawable.icon_website))
    .setIntent(
        Intent(
            Intent.ACTION_VIEW,
            Uri.parse("https://www.mysite.example.com/")
        )
    )
    .build()

ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

เพิ่มไลบรารีการผสานรวมทางลัดของ Google

ไลบรารีการผสานรวมทางลัดของ Google เป็นไลบรารี Jetpack ที่ไม่บังคับ ซึ่งช่วยให้คุณพุชทางลัดแบบไดนามิกที่แสดงบนแพลตฟอร์ม Android เช่น Launcher และแพลตฟอร์มของ Google ได้ การใช้ไลบรารีนี้จะช่วยให้ผู้ใช้ค้นพบทางลัดเพื่อเข้าถึงเนื้อหาที่เฉพาะเจาะจงหรือเล่นการดำเนินการซ้ำในแอปได้อย่างรวดเร็ว

ทางลัดแบบไดนามิกที่พุชด้วยไลบรารีนี้ไม่อยู่ภายใต้ขีดจำกัดทางลัดที่บังคับใช้ตามอุปกรณ์แต่ละเครื่อง ซึ่งจะช่วยให้แอปพุชทางลัดได้ทุกครั้งที่ผู้ใช้ดำเนินการที่เกี่ยวข้องในแอปจนเสร็จสมบูรณ์ การพุชทางลัดบ่อยๆ ด้วยวิธีนี้จะช่วยให้ Google เข้าใจรูปแบบการใช้งานของผู้ใช้และแนะนำทางลัดที่เกี่ยวข้องตามบริบทให้แก่ผู้ใช้ได้

ตัวอย่างเช่น Assistant สามารถเรียนรู้จากทางลัดที่พุชจากแอปติดตามการออกกำลังกายว่าผู้ใช้มักจะวิ่งทุกเช้า และจะแนะนำทางลัด "เริ่มวิ่ง" ในเชิงรุกเมื่อผู้ใช้หยิบโทรศัพท์ขึ้นมาในตอนเช้า

ไลบรารีการผสานรวมทางลัดของ Google ไม่มีฟังก์ชันการทำงานที่กำหนดแอดเดรสได้ด้วยตัวเอง การเพิ่มไลบรารีนี้ลงในแอปช่วยให้แพลตฟอร์มต่างๆ ของ Google รับทางลัดที่แอปพุชโดยใช้ ShortcutManagerCompat ได้

หากต้องการใช้ไลบรารีนี้ในแอป ให้เพิ่มทรัพยากร Dependency สำหรับไลบรารีการผสานรวมทางลัดของ Google และ ShortcutManagerCompat ลงในไฟล์ app/build.gradle หรือ app/build.gradle.kts ดังนี้

Kotlin

dependencies {
    implementation("androidx.core:core:1.6.0")
    implementation("androidx.core:core-google-shortcuts:1.0.0")
}

ดึงดูด

dependencies {
    implementation "androidx.core:core:1.6.0"
    implementation 'androidx.core:core-google-shortcuts:1.0.0'
}

เมื่อเพิ่มทรัพยากร Dependency ของไลบรารีลงในโปรเจ็กต์ Android แล้ว แอปของคุณจะใช้เมธอด pushDynamicShortcut() จาก ShortcutManagerCompat เพื่อพุชทางลัดแบบไดนามิกที่มีสิทธิ์แสดงใน Launcher และแพลตฟอร์มต่างๆ ของ Google ที่เข้าร่วมได้

สร้างทางลัดที่ปักหมุดไว้

ใน Android 8.0 (ระดับ API 26) ขึ้นไป คุณสามารถสร้างทางลัดที่ปักหมุดไว้ได้ ทางลัดที่ปักหมุดไว้จะปรากฏใน Launcher ที่รองรับเป็นไอคอนแยกต่างหาก ซึ่งต่างจากทางลัดแบบคงที่และแบบไดนามิก รูปที่ 1 แสดงความแตกต่างระหว่างทางลัด 2 ประเภทนี้

หากต้องการปักหมุดทางลัดไปยัง Launcher ที่รองรับโดยใช้แอป ให้ทำตามขั้นตอนต่อไปนี้

  1. ใช้ isRequestPinShortcutSupported() เพื่อยืนยันว่า Launcher เริ่มต้นของอุปกรณ์รองรับการปักหมุดแอปทางลัด
  2. สร้างออบเจ็กต์ ShortcutInfoCompat ที่มีรหัส Intent และป้ายกำกับสั้นๆ สำหรับทางลัด หากมีทางลัดอยู่แล้ว ให้ใช้รหัสของทางลัดที่มีอยู่ ระบบจะค้นหาและปักหมุดข้อมูลอื่นๆ ทั้งหมดที่เกี่ยวข้องกับทางลัดโดยอัตโนมัติ

  3. ปักหมุดทางลัดไปยัง Launcher ของอุปกรณ์โดยเรียกใช้ requestPinShortcut() ในระหว่างกระบวนการนี้ คุณสามารถส่งออบเจ็กต์ PendingIntent ซึ่งจะแจ้งเตือนแอปของคุณเมื่อปักหมุดทางลัดสำเร็จเท่านั้น

    หลังจากปักหมุดทางลัดแล้ว แอปจะอัปเดตเนื้อหาได้โดยใช้เมธอด updateShortcuts() โปรดอ่านข้อมูลเพิ่มเติมที่หัวข้ออัปเดตทางลัด

ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้างทางลัดที่ปักหมุดไว้

if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
    // Enable the existing shortcut with the ID "my-shortcut".
    val pinShortcutInfo = ShortcutInfoCompat.Builder(context, "my-shortcut")
        .setShortLabel("Website")
        .setIntent(
            Intent(
                Intent.ACTION_VIEW,
                Uri.parse("https://www.mysite.example.com/")
            )
        )
        .build()

    // Create the PendingIntent object only if your app needs to be notified
    // that the user let the shortcut be pinned. If the pinning operation fails,
    // your app isn't notified. Assume here that the app implements a method
    // called createShortcutResultIntent() that returns a broadcast intent.
    val pinnedShortcutCallbackIntent =
        ShortcutManagerCompat.createShortcutResultIntent(context, pinShortcutInfo)

    // Configure the intent so that your app's broadcast receiver gets the
    // callback successfully. For details, see PendingIntent.getBroadcast().
    val successCallback = PendingIntent.getBroadcast(
        context, /* request code */ 0,
        pinnedShortcutCallbackIntent, /* flags */ PendingIntent.FLAG_IMMUTABLE
    )

    ShortcutManagerCompat.requestPinShortcut(
        context,
        pinShortcutInfo,
        successCallback.intentSender
    )
}

สร้างกิจกรรมทางลัดที่กำหนดเอง

กิจกรรมกล่องโต้ตอบที่กำหนดเองซึ่งแสดงข้อความแจ้งว่า &quot;คุณต้องการเพิ่มไอคอน Launcher ของ Gmail ลงในหน้าจอหลักไหม&quot; ตัวเลือกที่กำหนดเองคือ &quot;ไม่เป็นไร&quot; และ &quot;เพิ่มไอคอน&quot;
รูปที่ 2 ตัวอย่างกิจกรรมกล่องโต้ตอบทางลัดของแอปที่กำหนดเอง

นอกจากนี้ คุณยังสร้างกิจกรรมเฉพาะที่ช่วยให้ผู้ใช้สร้างทางลัดได้ พร้อมด้วยตัวเลือกที่กำหนดเองและปุ่มยืนยัน รูปที่ 2 แสดงตัวอย่างกิจกรรมประเภทนี้ในแอป Gmail

ในไฟล์ Manifest ของแอป ให้เพิ่ม ACTION_CREATE_SHORTCUT ลงในองค์ประกอบ <intent-filter> ของกิจกรรม การประกาศนี้จะตั้งค่าลักษณะการทำงานต่อไปนี้เมื่อผู้ใช้พยายามสร้างทางลัด

  1. ระบบจะเริ่มกิจกรรมเฉพาะทางของแอป
  2. ผู้ใช้ตั้งค่าตัวเลือกสำหรับทางลัด
  3. ผู้ใช้เลือกปุ่มยืนยัน
  4. แอปของคุณสร้างทางลัดโดยใช้เมธอด createShortcutResultIntent() วิธีนี้จะแสดงผล Intent ซึ่งแอปของคุณจะส่งต่อกลับไปยังกิจกรรมที่ดำเนินการก่อนหน้านี้โดยใช้ setResult()
  5. แอปของคุณเรียกใช้ finish() ในกิจกรรมที่ใช้สร้างทางลัดที่กำหนดเอง

ในทำนองเดียวกัน แอปของคุณสามารถแจ้งให้ผู้ใช้เพิ่มทางลัดที่ปักหมุดไว้ในหน้าจอหลักหลังจากการติดตั้งหรือเมื่อเปิดแอปเป็นครั้งแรก วิธีนี้มีประสิทธิภาพเนื่องจากช่วยให้ผู้ใช้สร้างทางลัดเป็นส่วนหนึ่งของเวิร์กโฟลว์ปกติได้

ทดสอบทางลัด

หากต้องการทดสอบทางลัดของแอป ให้ติดตั้งแอปในอุปกรณ์ที่มี Launcher ที่รองรับทางลัด จากนั้นให้ดำเนินการต่อไปนี้

  • แตะไอคอน Launcher ของแอปค้างไว้เพื่อดูทางลัดที่คุณกำหนดไว้สำหรับแอป
  • ลากทางลัดเพื่อปักหมุดไว้ใน Launcher ของอุปกรณ์