Android 9 (ระดับ API 28) ขึ้นไปรองรับ App Standby Buckets สแตนด์บายแอป Buckets ช่วยให้ระบบจัดลำดับความสำคัญของคำขอทรัพยากรของแอปตามความถี่และระยะเวลาล่าสุดที่แอปถูกใช้งาน ระบบจะนำแอปแต่ละแอปไปไว้ใน Bucket ที่มีลำดับความสำคัญ 1 ใน 5 รายการตามรูปแบบการใช้งานแอป ระบบจะจำกัดทรัพยากรของอุปกรณ์ที่พร้อมใช้งานสำหรับแอปแต่ละแอปตาม Bucket ที่แอปอยู่
Bucket ที่มีลำดับความสำคัญ
ระบบจะกำหนดแอปแต่ละแอปให้กับ Bucket ที่มีลำดับความสำคัญแบบไดนามิก และกำหนดแอปใหม่ตามความจำเป็น ระบบอาจใช้แอปที่โหลดไว้ล่วงหน้าซึ่งใช้แมชชีนเลิร์นนิงเพื่อพิจารณาความน่าจะเป็นที่แอปแต่ละแอปจะถูกใช้งาน และกำหนดแอปให้กับ Bucket ที่เหมาะสม
หากไม่มีแอประบบในอุปกรณ์ ระบบจะจัดเรียงแอปตามค่าเริ่มต้นโดยอิงตามระยะเวลาล่าสุดที่แอปถูกใช้งาน ระบบจะกำหนดแอปที่มีการใช้งานมากกว่าให้กับ Bucket ที่ให้ลำดับความสำคัญสูงกว่า ซึ่งจะทำให้มีทรัพยากรระบบพร้อมใช้งานสำหรับแอปมากขึ้น โดยเฉพาะอย่างยิ่ง Bucket จะกำหนดความถี่ในการเรียกใช้งานของแอปและความถี่ที่แอปสามารถทริกเกอร์การปลุก ข้อจำกัดเหล่านี้จะมีผลเฉพาะในขณะที่อุปกรณ์ใช้พลังงานแบตเตอรี่ ขณะที่อุปกรณ์กำลังชาร์จ ระบบจะไม่กำหนดข้อจำกัดเหล่านี้
Bucket ที่มีลำดับความสำคัญมีดังนี้
- ใช้งานอยู่: แอปกำลังถูกใช้งานหรือเพิ่งถูกใช้งานเมื่อเร็วๆ นี้
- ชุดการทำงาน: แอปมีการใช้งานเป็นประจำ
- บ่อย: แอปมีการใช้งานบ่อยแต่ไม่ทุกวัน
- พบน้อย: แอปไม่มีการใช้งานบ่อย
- ถูกจำกัด: แอปใช้ทรัพยากรระบบจำนวนมากหรืออาจแสดงลักษณะการทำงานที่ไม่พึงประสงค์
นอกจาก Bucket ที่มีลำดับความสำคัญเหล่านี้แล้ว ยังมี Bucket ไม่เคย พิเศษสำหรับแอปที่ติดตั้งแต่ไม่เคยเรียกใช้งาน ระบบจะกำหนดข้อจำกัดที่เข้มงวดกับแอปเหล่านี้
คำอธิบายต่อไปนี้มีไว้สำหรับกรณีที่ไม่มีการคาดการณ์ ในทางตรงกันข้าม เมื่อการคาดการณ์ใช้แมชชีนเลิร์นนิงเพื่อคาดการณ์ลักษณะการทำงาน ระบบจะเลือก Bucket โดยคาดการณ์การดำเนินการครั้งถัดไปของผู้ใช้แทนที่จะอิงตามการใช้งานล่าสุด เช่น แอปที่เพิ่งใช้งานอาจไปอยู่ใน Bucket "พบน้อย" เนื่องจากแมชชีนเลิร์นนิงคาดการณ์ว่าแอปอาจไม่มีการใช้งานเป็นเวลาหลายชั่วโมง
ใช้งานอยู่
แอปจะอยู่ใน Bucket ใช้งานอยู่ ขณะที่แอปถูกใช้งาน เพิ่งถูกใช้งานเมื่อเร็วๆ นี้ หรือเมื่อแอปดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้
- เปิดใช้งาน
- เรียกใช้บริการที่ทำงานอยู่เบื้องหน้าเป็นเวลานาน
- ผู้ใช้แตะแอปจากการแจ้งเตือน
หากแอปอยู่ใน Bucket "ใช้งานอยู่" ระบบจะกำหนดข้อจำกัดน้อยที่สุดกับงานหรือการปลุกของแอป
- ตั้งแต่ Android 16 (ระดับ API 36) เป็นต้นไป งานเบื้องหลังจะมีโควต้าเวลาทำงานที่เพียงพอหากแอปใน Bucket "ใช้งานอยู่" เป็นผู้เริ่มงาน
ซึ่งรวมถึงงานที่กำหนดเวลาโดยตรงด้วย
JobSchedulerรวมถึง งานที่สร้างโดยไลบรารีอื่นๆ เช่น WorkManager หรือDownloadManager
การโต้ตอบกับผู้ใช้จะกำหนดให้แอปเป็น "ใช้งานอยู่"
ใน Android 9 (ระดับ API 28) ขึ้นไป เมื่อผู้ใช้โต้ตอบกับแอปของคุณในบางวิธี ระบบจะนำแอปของคุณไปไว้ใน Bucket "ใช้งานอยู่" ชั่วคราว หลังจากที่ผู้ใช้หยุดโต้ตอบกับแอปแล้ว ระบบจะนำแอปไปไว้ใน Bucket ตามประวัติการใช้งาน
ตัวอย่างการโต้ตอบที่ทริกเกอร์ลักษณะการทำงานของระบบนี้มีดังนี้
ผู้ใช้แตะการแจ้งเตือนที่แอปของคุณส่ง
ผู้ใช้โต้ตอบกับบริการที่ทำงานอยู่เบื้องหน้าในแอปของคุณโดยการแตะปุ่มสื่อ
ผู้ใช้เชื่อมต่อกับแอปของคุณขณะโต้ตอบกับ Android Automotive OS โดยที่แอปของคุณใช้บริการที่ทำงานอยู่เบื้องหน้าหรือ
CONNECTION_TYPE_PROJECTION
ชุดการทำงาน
แอปจะอยู่ใน Bucket ชุดการทำงาน หากแอปทำงานบ่อยแต่ไม่ได้ใช้งานอยู่ เช่น แอปโซเชียลมีเดียที่ผู้ใช้เปิดใช้งานเกือบทุกวันมีแนวโน้มที่จะอยู่ในชุดการทำงาน นอกจากนี้ ระบบยังเลื่อนระดับแอปไปที่ Bucket ชุดการทำงานหากมีการใช้งานแอปโดยอ้อม
หากแอปอยู่ในชุดการทำงาน ระบบจะกำหนดข้อจำกัดเล็กน้อยเกี่ยวกับความสามารถในการเรียกใช้งานและการทริกเกอร์การปลุก ดูรายละเอียดได้ที่การจัดการพลังงาน ขีดจำกัดทรัพยากร
บ่อย
แอปจะอยู่ใน Bucket บ่อย หากมีการใช้งานเป็นประจำแต่ไม่จำเป็นต้องทุกวัน เช่น แอปติดตามการออกกำลังกายที่ผู้ใช้เรียกใช้งานที่ยิมอาจอยู่ใน Bucket "บ่อย"
หากแอปอยู่ใน Bucket "บ่อย" ระบบจะกำหนดข้อจำกัดที่เข้มงวดมากขึ้นเกี่ยวกับความสามารถในการเรียกใช้งานและการทริกเกอร์การปลุก ดูรายละเอียดได้ที่การจัดการพลังงาน ขีดจำกัดทรัพยากร
พบน้อย
แอปจะอยู่ใน Bucket พบน้อย หากไม่มีการใช้งานบ่อย เช่น แอปโรงแรมที่ผู้ใช้เรียกใช้งานเฉพาะขณะเข้าพักที่โรงแรมนั้นๆ อาจอยู่ใน Bucket "พบน้อย"
หากแอปอยู่ใน Bucket "พบน้อย" ระบบจะกำหนดข้อจำกัดที่เข้มงวดเกี่ยวกับความสามารถในการเรียกใช้งานและการทริกเกอร์การปลุก นอกจากนี้ ระบบยังจำกัดความสามารถของแอปในการเชื่อมต่ออินเทอร์เน็ตด้วย ดูรายละเอียดได้ที่การจัดการพลังงาน ขีดจำกัดทรัพยากร
ถูกจำกัด
Bucket นี้เพิ่มเข้ามาใน Android 12 (ระดับ API 31) มีลำดับความสำคัญต่ำที่สุดและมีข้อจำกัดมากที่สุดในบรรดา Bucket ทั้งหมด ระบบจะพิจารณาลักษณะการทำงานของแอป เช่น ความถี่ที่ผู้ใช้โต้ตอบกับแอป เพื่อตัดสินใจว่าจะนำแอปไปไว้ใน Bucket "ถูกจำกัด" หรือไม่
ใน Android 13 (API ระดับ 33) ขึ้นไป ระบบจะนำแอปของคุณไปไว้ใน Bucket "ถูกจำกัด" ใน สถานการณ์ต่อไปนี้ เว้นแต่ว่าแอปของคุณจะมีสิทธิ์ได้รับการ ยกเว้น
ผู้ใช้ไม่ได้โต้ตอบกับแอปของคุณเป็นเวลาจำนวนวันที่กำหนด ใน Android 12 (ระดับ API 31) และ 12L (ระดับ API 32) จำนวนวันคือ 45 วัน Android 13 ลดจำนวนวันลงเหลือ 8 วัน
แอปของคุณเรียกใช้การออกอากาศหรือ การผูก มากเกินไปในช่วงระยะเวลา 24 ชั่วโมง
หากระบบนำแอปของคุณไปไว้ใน Bucket "ถูกจำกัด" ข้อจำกัดต่อไปนี้จะมีผล
- คุณสามารถเรียกใช้งานได้วันละ 1 ครั้งในเซสชันแบบรวมกลุ่ม 10 นาที ในระหว่างเซสชันนี้ ระบบจะจัดกลุ่มงานของแอปของคุณกับงานของแอปอื่นๆ
- งานที่ถูกจำกัดจะไม่ทำงานด้วยตัวเอง ต้องมีงานอื่นอย่างน้อย 1 งานที่กำลังทำงานอยู่หรือรอดำเนินการในเวลาเดียวกัน ซึ่งอาจรวมถึงงานอื่นๆ
- แอปของคุณสามารถเรียกใช้งานแบบเร่งด่วนได้น้อยลงเมื่อเทียบกับกรณีที่ระบบ นำแอปของคุณไปไว้ใน Bucket ที่มีข้อจำกัดน้อยกว่า
- แอปของคุณสามารถเรียกการปลุกได้วันละ 1 ครั้ง การปลุกนี้อาจเป็นการปลุกที่แม่นยำ หรือการปลุกที่ไม่แม่นยำ
การยกเว้นจาก Bucket "ถูกจำกัด"
แอปประเภทต่อไปนี้จะได้รับการยกเว้นจากการเข้าสู่ Bucket "ถูกจำกัด" และข้ามทริกเกอร์การไม่มีการใช้งาน แม้ใน Android 12 ขึ้นไป
- แอปอุปกรณ์ที่ใช้ร่วมกัน
- แอปที่ทำงานในอุปกรณ์ใน โหมดสาธิต
- แอปเจ้าของอุปกรณ์
- แอปเจ้าของโปรไฟล์
- แอปที่ทำงานอยู่ตลอดเวลา
- แอป VPN
- แอปที่มีบทบาท
ROLE_DIALER - แอปที่ผู้ใช้กำหนดไว้อย่างชัดเจนว่าให้ฟังก์ชันการทำงาน "ไม่จำกัด" ในการตั้งค่าระบบ
- แอปที่มีวิดเจ็ตที่ใช้งานอยู่
- แอปที่ได้รับสิทธิ์ต่อไปนี้อย่างน้อย 1 รายการ
ประเมิน Bucket ที่มีลำดับความสำคัญ
หากต้องการตรวจสอบว่าระบบกำหนดแอปของคุณให้กับ Bucket ใด ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
เรียก
getAppStandbyBucket()เรียกใช้คำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัล
adb shell am get-standby-bucket PACKAGE_NAME
ระบบจะควบคุมแอปของคุณเมื่อใดก็ตามที่แอปถูกนำไปไว้ใน App Standby Bucket ที่มีค่ามากกว่า STANDBY_BUCKET_ACTIVE (10)
แนวทางปฏิบัติแนะนำ
หากแอปของคุณปฏิบัติตามแนวทางปฏิบัติแนะนำสำหรับ Doze และสแตนด์บายแอป ฟีเจอร์การจัดการพลังงานในภายหลังจะไม่ใช่เรื่องยาก อย่างไรก็ตาม ลักษณะการทำงานบางอย่างของแอปที่เคยทำงานได้ดีอาจทำให้เกิดปัญหา
- อย่าพยายามจัดการให้ระบบนำแอปของคุณไปไว้ใน Bucket ที่ต้องการ วิธีการกำหนดลำดับความสำคัญของระบบอาจมีการเปลี่ยนแปลง และผู้ผลิตอุปกรณ์ทุกรายอาจเลือกที่จะเขียนแอปการจัดกลุ่มของตนเองด้วยอัลกอริทึมของตนเอง แต่ให้ตรวจสอบว่าแอปของคุณทำงานอย่างเหมาะสมไม่ว่าแอปจะอยู่ใน Bucket ใดก็ตาม
- หากแอปไม่มีกิจกรรมตัวเปิดใช้ ระบบอาจไม่เลื่อนระดับแอปไปที่ Bucket "ใช้งานอยู่" ลองออกแบบแอปใหม่ให้มีกิจกรรมดังกล่าว
หากผู้ใช้โต้ตอบกับการแจ้งเตือนของแอปไม่ได้ ผู้ใช้จะไม่สามารถทริกเกอร์การเลื่อนระดับแอปไปที่ Bucket "ใช้งานอยู่" ในกรณีนี้ ลองออกแบบการแจ้งเตือนบางรายการใหม่เพื่อให้ผู้ใช้โต้ตอบได้ ดูหลักเกณฑ์บางส่วนได้ที่ รูปแบบการออกแบบการแจ้งเตือนของ Material Design
หากแอปไม่แสดงการแจ้งเตือนเมื่อได้รับข้อความ ที่มีลำดับความสำคัญสูง Firebase Cloud Messaging (FCM) ผู้ใช้จะไม่สามารถโต้ตอบกับ แอปและเลื่อนระดับแอปไปที่ Bucket "ใช้งานอยู่" ได้ อันที่จริงแล้ว การใช้งานที่ตั้งใจไว้สำหรับข้อความ FCM ที่มีลำดับความสำคัญสูงคือการส่งการแจ้งเตือนไปยังผู้ใช้ ดังนั้นสถานการณ์นี้จึงต้องไม่เกิดขึ้น ใน 12L (ระดับ API 32) และต่ำกว่า หากคุณทำเครื่องหมายข้อความ FCM เป็นลำดับความสำคัญสูงอย่างไม่เหมาะสมเมื่อข้อความนั้นไม่ทริกเกอร์การโต้ตอบของผู้ใช้ ข้อความในอนาคตอาจถูกลดลำดับความสำคัญ
หากแอปแยกออกเป็นหลายแพ็กเกจ แพ็กเกจเหล่านั้นอาจอยู่ใน Bucket ที่ต่างกันและมีระดับการเข้าถึงที่ต่างกัน ทดสอบแอปเหล่านี้ด้วยแพ็กเกจที่กำหนดให้กับ Bucket ต่างๆ เพื่อให้แน่ใจว่าแอปทำงานอย่างเหมาะสม