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

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

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

ลักษณะการทำงานของแป้นพิมพ์ลัด

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

ระดับการเข้าถึงทางลัด

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

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

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

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

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

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

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

เมื่อ Launcher แสดงทางลัดของแอป ทางลัดเหล่านั้นต้องปรากฏตามลำดับต่อไปนี้

  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 รายการ สำหรับชุดค่าผสมของทางลัดแบบคงที่และทางลัดแบบไดนามิกที่กำหนดไว้ Launcher จะแสดงทางลัดแบบคงที่สูงสุด 2 รายการและทางลัดแบบไดนามิกสูงสุด 2 รายการ ตัวอย่างเช่น หากคุณกำหนดทางลัดแบบคงที่ 4 รายการและสร้างทางลัดแบบไดนามิก 3 รายการแบบเป็นโปรแกรม Launcher จะแสดงทางลัดแบบคงที่ 2 รายการแรกและทางลัดแบบไดนามิกที่มีอันดับสูงสุด 2 รายการ

จัดการความตั้งใจและกิจกรรมหลายรายการ

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

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

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

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

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

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

ตั้งค่าแฟล็ก 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 เมธอดนี้จะพยายามแปลงรายการทางลัดที่ระบุเป็นทางลัดแบบไดนามิก

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

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

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

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

ติดตามการใช้ทางลัด

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

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

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

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

ปิดใช้ทางลัด

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

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

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

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

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

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

adb shell cmd shortcut reset-throttling [ --user your-user-id ]

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

คุณอนุญาตให้ผู้ใช้ดำเนินการสำรองและกู้คืนข้อมูลในแอปเมื่อเปลี่ยนอุปกรณ์ได้โดยรวมการกำหนดแอตทริบิวต์ 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.getShortcuts(this, ShortcutManagerCompat.FLAG_MATCH_PINNED).isNotEmpty()) {
                // Pinned shortcuts are restored. Use updateShortcuts() to make
                // sure they contain up-to-date information.
            }
        }
    }
    // ...
}