สร้างทางลัด

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

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

วิธีนำเสนอเนื้อหาด้วยทางลัดจะขึ้นอยู่กับกรณีการใช้งานและบริบทของทางลัดว่าเป็นแบบที่แอปเป็นผู้กำหนดหรือผู้ใช้เป็นผู้กำหนด แม้ว่าบริบทของทางลัดแบบคงที่จะไม่เปลี่ยนแปลงและบริบทของทางลัดแบบไดนามิกจะเปลี่ยนแปลงอยู่ตลอดเวลา แต่แอปของคุณจะเป็นผู้กำหนดบริบทในทั้ง 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 ในตัวของการดำเนินการของแอป การผูกความสามารถนี้ช่วยให้ผู้ใช้ใช้คำสั่งเสียงกับ Google Assistant เพื่อเรียกใช้ทางลัดได้

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

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

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

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 Shortcuts Integration Library

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

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

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

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

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

  1. อัปเดตไฟล์ gradle.properties เพื่อรองรับ ไลบรารี AndroidX โดยทำดังนี้

    android.useAndroidX=true
    # Automatically convert third-party libraries to use AndroidX
    android.enableJetifier=true
    
  2. ใน app/build.gradle ให้เพิ่มการพึ่งพาสำหรับ Google Shortcuts Integration Library และ ShortcutManagerCompat โดยทำดังนี้

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

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

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

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

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

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

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

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

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

val shortcutManager = getSystemService<ShortcutManager>()

if (shortcutManager!!.isRequestPinShortcutSupported) {
    // Enable the existing shortcut with the ID "my-shortcut".
    val pinShortcutInfo = ShortcutInfo.Builder(context, "my-shortcut").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 = shortcutManager.createShortcutResultIntent(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 */ 0)

    shortcutManager.requestPinShortcut(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 ของอุปกรณ์