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