จัดการทางลัด

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

หน้านี้จะอธิบายวิธีเหล่านี้และวิธีอื่นๆ ที่ใช้กันทั่วไปในการจัดการทางลัด

ลักษณะการทำงานของทางลัด

ส่วนต่อไปนี้มีข้อมูลทั่วไปเกี่ยวกับลักษณะการทำงานของทางลัด รวมถึงระดับการมองเห็น ลำดับการแสดง และอันดับ

การแสดงทางลัด

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

คลาส LauncherApps มี API สำหรับแอป Launcher เพื่อเข้าถึง ทางลัด

เนื่องจากทางลัดที่ปักหมุดจะปรากฏในตัว Launcher เอง จึงมองเห็นได้เสมอ ระบบจะนำทางลัดที่ปักหมุดออกจากตัวเรียกใช้ในกรณีต่อไปนี้เท่านั้น

  • ผู้ใช้นำออก
  • ระบบถอนการติดตั้งแอปที่เชื่อมโยงกับทางลัด
  • ผู้ใช้ล้างข้อมูลของแอปโดยไปที่การตั้งค่า > แอปและการแจ้งเตือน เลือกแอป แล้วแตะพื้นที่เก็บข้อมูล > ล้างพื้นที่เก็บข้อมูล

เป้าหมายการแชร์คือชุดย่อยของทางลัดแบบไดนามิกที่ปรากฏในแถวการแชร์โดยตรงของชีตการแชร์ของ Android

Android Sharesheet
รูปที่ 1 Android Sharesheet เป้าหมายการแชร์โดยตรงจะปรากฏในแถวแรก ตามด้วยแอปที่จัดอันดับ แล้วจึงเป็นรายการแอป

ลำดับการแสดงทางลัด

เมื่อตัวเรียกใช้แสดงทางลัดของแอป ทางลัดจะต้องปรากฏตามลำดับต่อไปนี้

  1. ทางลัดแบบคงที่: ทางลัดที่เมธอด isDeclaredInManifest() แสดงผล true
  2. ทางลัดแบบไดนามิก: ทางลัดที่เมธอด ShortcutInfo.isDynamic() ส่งคืน true

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

อันดับต้องเป็นจำนวนเต็มที่ไม่ติดลบและเรียงตามลำดับ ระบบจะจัดอันดับทางลัดแบบคงที่จากรายการแรกไปจนถึงรายการสุดท้ายตามลำดับที่ปรากฏในไฟล์ shortcuts.xml สำหรับทางลัดแบบไดนามิก คุณสามารถอัปเดตอันดับของทางลัดที่มีอยู่ได้เมื่อเรียกใช้ updateShortcuts(Context, List), addDynamicShortcuts(Context, List), pushDynamicShortcut(Context, ShortcutInfoCompat) หรือ setDynamicShortcuts(Context, List)

ลำดับของเป้าหมายการแชร์ขึ้นอยู่กับปัจจัยต่างๆ ซึ่งรวมถึงประวัติของผู้ใช้ในอดีต ความใหม่ ความถี่ คำแนะนำในการจัดอันดับ การใช้งานแอป และลำดับความสำคัญที่ตั้งไว้ในการสนทนาที่เชื่อมโยงกับทางลัดการแชร์ ระบบจะจัดลำดับความสำคัญของเป้าหมายการแชร์ ที่สร้างขึ้นโดยใช้ Sharing Shortcuts API เหนือเป้าหมายการแชร์ ที่สร้างโดย ChooserTargetService ซึ่งเลิกใช้งานไปแล้วใน Android 11 ใน Android 12 ขึ้นไป เป้าหมายการแชร์ที่สร้างโดย ChooserTargetService ที่เลิกใช้งานแล้วจะไม่ปรากฏในชีตการแชร์อีกต่อไป

โดย Launcher ส่วนใหญ่จะแสดงทางลัดได้สูงสุด 4 รายการ สำหรับชุดค่าผสมของ ทางลัดแบบคงที่และทางลัดแบบไดนามิกที่กำหนดไว้ ตัวเรียกใช้จะแสดง ทางลัดแบบคงที่และทางลัดแบบไดนามิกสูงสุด 2 รายการ เช่น หากคุณ กำหนดทางลัดแบบคงที่ 4 รายการและสร้างทางลัดแบบไดนามิก 3 รายการโดยอัตโนมัติ ตัวเรียกใช้จะแสดงทางลัดแบบคงที่ 2 รายการแรก และทางลัดแบบไดนามิก 2 รายการ ที่มีอันดับสูงสุด

จัดการหลายเจตนาและกิจกรรม

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

เริ่มกิจกรรมหนึ่งจากอีกกิจกรรมหนึ่ง

ทางลัดแบบคงที่ต้องไม่มีค่าสถานะความตั้งใจที่กำหนดเอง Intent แรกของทางลัดแบบคงที่จะมีค่า Intent.FLAG_ACTIVITY_NEW_TASK และ Intent.FLAG_ACTIVITY_CLEAR_TASK เสมอ ซึ่งหมายความว่าเมื่อแอป ทํางานอยู่ ระบบจะทําลายกิจกรรมที่มีอยู่ทั้งหมดในแอปเมื่อเปิดใช้ ทางลัดแบบคงที่ หากไม่ต้องการให้เกิดลักษณะการทำงานนี้ คุณสามารถใช้กิจกรรมแทรมโพลีน ซึ่งเป็นกิจกรรมที่มองไม่เห็นซึ่งเริ่มกิจกรรมอื่นได้โดยการเรียกใช้ finish ภายในบล็อกการเปิดตัวหรือ onCreate ก่อนที่จะตั้งค่าเนื้อหา Compose

  1. ใน AndroidManifest.xml file ให้รวมการกําหนดแอตทริบิวต์ android:taskAffinity="" ในกิจกรรมแทรมโพลีน

  2. ในไฟล์ทรัพยากรทางลัด ให้อ้างอิงกิจกรรมแทรมโพลีนใน Intent ภายในทางลัดแบบคงที่

ดูข้อมูลเพิ่มเติมเกี่ยวกับกิจกรรมที่ใช้ Trampoline ได้ที่ เริ่มกิจกรรมหนึ่งจากอีกกิจกรรมหนึ่ง

ตั้งค่า Flag ของ Intent

คุณสามารถเผยแพร่ทางลัดแบบไดนามิกด้วยชุดค่าสถานะ Intent ใดก็ได้ ควรระบุชุดค่าผสมของ Intent.FLAG_ACTIVITY_SINGLE_TOP และ Intent.FLAG_ACTIVITY_CLEAR_TOP ใน Intent ของทางลัด ซึ่งจะช่วยให้มั่นใจได้ว่าหาก ComponentActivity ทำงานอยู่แล้ว ระบบจะนำมาไว้เบื้องหน้าและนำกลับมาใช้ใหม่โดยไม่ทำลาย ซึ่งจะช่วยให้สถาปัตยกรรมแบบกิจกรรมเดียวจัดการเหตุการณ์ทางลัดผ่าน onNewIntent() ได้อย่างราบรื่น

ดูข้อมูลเพิ่มเติมเกี่ยวกับงานและแฟล็ก Intent ได้ที่งานและ Back Stack

อัปเดตทางลัด

ไอคอน Launcher ของแต่ละแอปสามารถมีทางลัดแบบคงที่และแบบไดนามิก รวมกันได้สูงสุดเท่ากับค่าที่ getMaxShortcutCountPerActivity แสดงผล แอปสร้าง ทางลัดที่ปักหมุดได้ไม่จำกัดจำนวน

เมื่อปักหมุดทางลัดแบบไดนามิก แม้ว่าผู้เผยแพร่จะนำทางลัดดังกล่าวออกในฐานะ ทางลัดแบบไดนามิกแล้ว แต่ทางลัดที่ปักหมุดไว้จะยังคงมองเห็นได้และเปิดใช้ได้ ซึ่งช่วยให้แอปมีทางลัดได้มากกว่า getMaxShortcutCountPerActivity รายการ

ลองดูตัวอย่างต่อไปนี้ ซึ่งสมมติว่าค่าที่ส่งคืนโดย getMaxShortcutCountPerActivity คือ 4

  1. แอปแชทเผยแพร่ทางลัดแบบไดนามิก 4 รายการ ซึ่งแสดงถึงการสนทนาล่าสุด 4 รายการ ได้แก่ c1, c2, c3 และ c4
  2. ผู้ใช้ปักหมุดทางลัดทั้ง 4 รายการ
  3. ต่อมา ผู้ใช้เริ่มการสนทนาเพิ่มเติม 3 รายการ ได้แก่ c5, c6 และ c7 แอปผู้เผยแพร่จะเผยแพร่แป้นพิมพ์ลัดแบบไดนามิกอีกครั้ง แป้นพิมพ์ลัดแบบไดนามิกใหม่ มีดังนี้ c4, c5, c6 และ c7

แอปต้องนำ c1, c2 และ c3 ออก เนื่องจากแสดงทางลัดแบบไดนามิกได้ไม่เกิน 4 รายการ อย่างไรก็ตาม c1, c2 และ c3 ยังคงเป็นทางลัดที่ปักหมุดไว้ซึ่ง ผู้ใช้สามารถเข้าถึงและเปิดใช้ได้

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

  1. แอปสามารถใช้ updateShortcuts(Context, List) เพื่ออัปเดตทางลัดที่มีอยู่ทั้ง 7 รายการได้ ตัวอย่างเช่น คุณอาจอัปเดตชุด แป้นพิมพ์ลัดนี้เมื่อไอคอนของเพื่อนร่วมแชทเปลี่ยนไป
  2. คุณสามารถใช้วิธี addDynamicShortcuts(Context, List) และ setDynamicShortcuts(Context, List) เพื่ออัปเดตทางลัดที่มีอยู่ ด้วยรหัสเดียวกัน อย่างไรก็ตาม คุณจะใช้รายการเหล่านี้เพื่ออัปเดตทางลัดที่ตรึงไว้ซึ่งไม่ใช่แบบไดนามิกไม่ได้ เนื่องจากทั้ง 2 วิธีนี้พยายามแปลงรายการทางลัดที่ระบุให้เป็นทางลัดแบบไดนามิก

ไม่มีการจำกัดจำนวนทางลัดที่สามารถพุชเพื่อแสดงในแอป Assistant เช่น Google Assistant ใช้เมธอด pushDynamicShortcut ของไลบรารี ShortcutManagerCompat Jetpack เพื่อสร้างและอัปเดต ทางลัดสำหรับใช้ในแอปผู้ช่วย นอกจากนี้ ให้เพิ่มไลบรารีการผสานรวมทางลัดของ Google ลงในแอปเพื่อให้ลิงก์แบบไดนามิกมีสิทธิ์ปรากฏใน Google Assistant

ดูข้อมูลเพิ่มเติมเกี่ยวกับหลักเกณฑ์สำหรับทางลัดของแอป รวมถึงการอัปเดตทางลัดได้ที่แนวทางปฏิบัติแนะนำสำหรับทางลัด

จัดการการเปลี่ยนแปลงภาษาของระบบ

แอปต้องอัปเดตทางลัดแบบไดนามิกและทางลัดที่ปักหมุดไว้เมื่อได้รับข้อความออกอากาศ Intent.ACTION_LOCALE_CHANGED ที่ระบุการเปลี่ยนแปลงภาษาของระบบ

ติดตามการใช้แป้นพิมพ์ลัด

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

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

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

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

ปิดใช้แป้นพิมพ์ลัด

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

การจำกัดอัตราคำขอ

เมื่อใช้เมธอด setDynamicShortcuts, addDynamicShortcuts หรือ updateShortcuts คุณอาจเรียกใช้เมธอดเหล่านี้ได้เพียงจำนวนครั้งที่กำหนด ในแอปที่ทำงานอยู่เบื้องหลัง ซึ่งเป็นแอปที่ไม่มีกิจกรรมหรือบริการที่ทำงานอยู่เบื้องหน้า การจำกัดจำนวนครั้งที่คุณเรียกใช้เมธอดเหล่านี้ได้เรียกว่าการจำกัดอัตราคำขอ ฟีเจอร์นี้ช่วยป้องกันไม่ให้ ShortcutManagerCompat ใช้ทรัพยากรของอุปกรณ์มากเกินไป

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

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

หากพบการจำกัดอัตราในระหว่างการพัฒนาหรือการทดสอบ คุณสามารถเลือกตัวเลือกสำหรับนักพัฒนาแอป > รีเซ็ตการจำกัดอัตราของ ShortcutManager จากการตั้งค่า ของอุปกรณ์ หรือป้อนคำสั่งต่อไปนี้ใน adb

$ adb shell cmd shortcut reset-throttling [ --user <var>your-user-id</var> ]

การสำรองและคืนค่า

คุณอนุญาตให้ผู้ใช้ดำเนินการสำรองและกู้คืนข้อมูลในแอปได้เมื่อเปลี่ยนอุปกรณ์โดยรวมการกำหนดแอตทริบิวต์ android:allowBackup="true" ไว้ในไฟล์ Manifest ของแอป หากคุณรองรับการสำรองข้อมูลและคืนค่า โปรดคำนึงถึงประเด็นต่อไปนี้เกี่ยวกับทางลัดของแอป

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

ข้อมูลโค้ดต่อไปนี้แสดงวิธีที่ดีที่สุดในการกู้คืนทางลัดแบบไดนามิกของแอป และวิธีตรวจสอบว่าระบบได้เก็บรักษาทางลัดที่ปักหมุดของแอปไว้หรือไม่

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (ShortcutManagerCompat.getDynamicShortcuts(this).isEmpty()) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.getPinnedShortcuts(this).isNotEmpty()) {
                // Pinned shortcuts are restored. Use updateShortcuts() to make
                // sure they contain up-to-date information.
            }

        }
    }
    // ...
}