หากแอปกำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) ขึ้นไป และผู้ใช้ไม่ได้ใช้ โต้ตอบกับแอปของคุณเป็นเวลา 2-3 เดือน ระบบจะวาง แอปที่อยู่ในสถานะไฮเบอร์เนต ระบบจะเพิ่มประสิทธิภาพพื้นที่เก็บข้อมูลแทน ประสิทธิภาพการทำงาน และระบบปกป้องข้อมูลผู้ใช้ การทำงานของระบบนี้คล้ายกัน กับสิ่งที่เกิดขึ้นเมื่อผู้ใช้บังคับให้แอปของคุณหยุดเองในการตั้งค่าระบบ
ผลของการพักการใช้งาน
ตามที่แสดงในตารางที่ 1 ผลของการพักการใช้งานจะขึ้นอยู่กับ SDK เป้าหมายของแอป รวมทั้งอุปกรณ์ที่แอปของคุณทำงานอยู่
เวอร์ชัน SDK เป้าหมาย | ลักษณะเฉพาะของอุปกรณ์ | ผลของการจำศีล |
---|---|---|
Android 12 ขึ้นไป | ใช้ Android 12 ขึ้นไป |
รันไทม์ของแอปคุณ ระบบจะรีเซ็ตสิทธิ์ การดำเนินการนี้จะมีผลเหมือนกับว่าผู้ใช้ ดูสิทธิ์ในการตั้งค่าระบบและเปลี่ยนระดับการเข้าถึงของแอป เป็น Deny แอปของคุณเรียกใช้งานหรือการแจ้งเตือนจากในเบื้องหลังไม่ได้ แอปของคุณรับข้อความ Push รวมถึงลำดับความสำคัญสูงไม่ได้ ข้อความที่ส่งผ่าน Firebase Cloud การรับส่งข้อความ |
Android 11 | ใช้ Android 11 | ระบบจะรีเซ็ตสิทธิ์รันไทม์ของแอป |
Android 11 | ใช้งาน Android 6.0 (API ระดับ 23) ถึง Android 10 (API ระดับ 29) โดยรวม และขับเคลื่อนโดย Google บริการ Google Play |
ระบบจะรีเซ็ตสิทธิ์รันไทม์ของแอป ซึ่งการดำเนินการนี้จะมีผลในเดือนธันวาคม 2021 ดูข้อมูลเพิ่มเติมในบล็อกนี้ โพสต์เกี่ยวกับ กำลังทำ สิทธิ์ที่รีเซ็ตอัตโนมัติจะใช้ได้ในอุปกรณ์อีกหลายพันล้านเครื่อง |
การทำงานของระบบเมื่อแอปออกจากโหมดไฮเบอร์
เมื่อผู้ใช้โต้ตอบกับแอปของคุณครั้งถัดไป แอปจะออกจากการพักใช้งาน สามารถสร้างงาน การแจ้งเตือน และการแจ้งเตือนอีกครั้ง
แต่ระบบจะไม่ดำเนินการต่อไปนี้กับแอปของคุณ
ให้สิทธิ์รันไทม์ของแอปอีกครั้ง
ผู้ใช้จะต้องให้สิทธิ์เหล่านี้แก่แอปของคุณอีกครั้ง
กำหนดเวลางาน การเตือน และการแจ้งเตือนที่กำหนดเวลาไว้ก่อนหน้านี้ใหม่ แอปของคุณอยู่ในโหมดสลีป
เพื่อให้เวิร์กโฟลว์นี้ง่ายขึ้น ให้ใช้ WorkManager นอกจากนี้ คุณยังเพิ่ม ตรรกะการจัดตารางเวลาใหม่ใน
ACTION_BOOT_COMPLETED
Broadcast Receiver ซึ่งมีการเรียกใช้เมื่อแอปของคุณออกจากการพักใช้งานและ หลังจากอุปกรณ์เปิดเครื่อง
การใช้งานแอป
ส่วนต่อไปนี้จะมีตัวอย่างการใช้งานแอป รวมถึงตัวอย่างของ การดำเนินการที่ระบบไม่ถือว่าเป็นการใช้งานแอป
ตัวอย่างการใช้งานแอป
เมื่อกิจกรรมในแอป กลับมาใช้งานอีกครั้ง ระบบจะถือว่าเหตุการณ์นี้เป็นการโต้ตอบของผู้ใช้ ดังนั้น ระบบจะขยายเวลาก่อนที่แอปของคุณจะเข้าสู่การพักการใช้งาน
ใน Android 11 ขึ้นไป ลักษณะการทำงานต่อไปนี้มีดังนี้ ที่ถือว่าเป็นการโต้ตอบของผู้ใช้:
- ผู้ใช้ใช้งานวิดเจ็ต
ผู้ใช้โต้ตอบกับการแจ้งเตือน ยกเว้นการปิดการแจ้งเตือน การแจ้งเตือน
โปรดทราบว่าการใช้แอปเพื่อไฮเบอร์โทรไม่ได้ การโต้ตอบของผู้ใช้ ตราบใดที่มีการเรียกคอมโพเนนต์ของแพ็กเกจ คอมโพเนนต์ดังกล่าวจะยังคง ถือเป็นการใช้งานแอป ตัวอย่างของเนื้อหาประเภทนี้ ได้แก่
- แอปที่มีบริการหรือผู้ให้บริการเนื้อหาที่ผูกกับแอปอื่นในอุปกรณ์ หรือระบบปฏิบัติการ เช่น Input Method Editor (IME) หรือเครื่องมือจัดการรหัสผ่าน
เครื่องรับสัญญาณประกาศในแพ็กเกจที่ได้รับการออกอากาศที่ชัดเจนจาก แพ็กเกจภายนอก
ไม่ใช่ตัวอย่าง
หากแอปเคยแสดงลักษณะการทำงานตามที่อธิบายไว้ในรายการต่อไปนี้เท่านั้น แอปของคุณจะเข้าสู่การพักใช้งานหลังจากผ่านไปสองสามเดือน
- เรียกใช้งานที่กำหนดเวลาไว้โดยใช้
JobScheduler
- รับการออกอากาศโดยนัย
- ตั้งเวลาปลุก
การยกเว้นระบบจากการพักการใช้งาน
Android ให้การยกเว้นระดับระบบจากการพักการใช้งานแอปในบางกรณี หากแอปจัดอยู่ในหมวดหมู่ใดหมวดหมู่หนึ่งต่อไปนี้ แอปนั้นจะได้รับการยกเว้น จากมาตรฐานการใช้งานแอป และจะไม่ใช้งานโหมดไฮเบอร์
- แอปไม่แสดงบน Launcher
- แอปที่ไม่มีการ์ดทางลัดที่ใช้งานอยู่บน Launcher
- แอปโปรไฟล์งาน
- แอปที่ผู้ใช้ติดตั้งในโปรไฟล์งาน โปรดทราบว่าหากแอปเดียวกันอยู่ในโปรไฟล์ส่วนตัวด้วย เฉพาะงาน แอปโปรไฟล์ได้รับการยกเว้น
- เครื่องมือควบคุมนโยบายด้านอุปกรณ์
- แอปที่ควบคุมนโยบายด้านอุปกรณ์ภายในและแอปพลิเคชันระบบในอุปกรณ์
- แอปที่ได้รับสิทธิ์ของผู้ให้บริการ
- แอปที่ผู้ให้บริการโทรศัพท์มือถือโหลดไว้ล่วงหน้าในอุปกรณ์และเห็นว่าจำเป็น ภาระหน้าที่ในการให้บริการตามสัญญา เช่น แอปข้อความเสียงหรือแอปฝ่ายบริการลูกค้า
- แอปโปรแกรมติดตั้ง 3p
- App Store ของบุคคลที่สามสำหรับการอัปเดตอัตโนมัติสำหรับแอปที่ติดตั้งแล้ว เมื่อจำเป็น
การยกเว้นของผู้ใช้จากการพักการใช้งาน
หากคุณคาดว่า Use Case หลักในแอปได้รับผลกระทบจากการพักการใช้งาน คุณสามารถขอการยกเว้นการพักการใช้งานแอปจากผู้ใช้ได้ การยกเว้นนี้ มีประโยชน์ในสถานการณ์ที่ผู้ใช้คาดหวังให้แอปทำงาน ในเบื้องหลัง แม้ว่าผู้ใช้จะไม่ได้โต้ตอบกับแอปของคุณก็ตาม เช่น แอปของคุณดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้
- รักษาความปลอดภัยของครอบครัวด้วยการรายงานตำแหน่งของครอบครัวเป็นระยะๆ
- ซิงค์ข้อมูลระหว่างอุปกรณ์กับเซิร์ฟเวอร์ของแอป
- สื่อสารกับอุปกรณ์อัจฉริยะ เช่น ทีวี
- จับคู่กับอุปกรณ์ที่ใช้ร่วมกัน เช่น นาฬิกา
หากต้องการขอการยกเว้น ให้ทำตามขั้นตอนในส่วนต่อไปนี้
ตรวจสอบว่าผู้ใช้ปิดใช้งานการพักใช้งานสำหรับแอปของคุณแล้วหรือยัง
หากต้องการตรวจสอบว่าผู้ใช้ปิดใช้งานการพักใช้งานของแอปของคุณแล้วหรือไม่
ใช้getUnusedAppRestrictionsStatus()
API
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ API นี้ในแอปของคุณ โปรดดูที่ API ตัวอย่างโค้ดในหน้านี้
ขอให้ผู้ใช้ปิดใช้งานการพักใช้งานสำหรับแอปของคุณ
หากผู้ใช้ยังไม่ได้ปิดใช้งานการพักการใช้งานสำหรับแอปของคุณ คุณสามารถส่ง คำขอให้กับผู้ใช้ โดยทำตามขั้นตอนต่อไปนี้
- แสดง UI ที่อธิบายให้ผู้ใช้ทราบถึงเหตุผลที่ต้องปิดใช้ การพักใช้งานแอป
-
เรียกใช้
createManageUnusedAppRestrictionsIntent()
API ตามที่แสดงในตัวอย่างโค้ด API API นี้จะสร้าง Intent ที่โหลดหน้าจอข้อมูลแอปในการตั้งค่า จากที่นี่ ผู้ใช้สามารถปิดการพักใช้งานแอปได้คุณต้องโทรหา
startActivityForResult()
ไม่ใช่startActivity()
เมื่อส่ง Intent นี้ตามที่แสดงในตารางที่ 2 ตำแหน่งและชื่อของตัวเลือกจะขึ้นอยู่กับ ลักษณะเฉพาะของอุปกรณ์ที่ติดตั้งแอปของคุณ
ตาราง 2 ตัวเลือกที่ปิดใช้งานการพักใช้งานสำหรับ แอป ลักษณะเฉพาะของอุปกรณ์ หน้าที่ตัวเลือกปรากฏ ชื่อของตัวเลือกที่จะปิด ใช้ Android 13 ขึ้นไป ข้อมูลแอป หยุดกิจกรรมบนแอปไว้ชั่วคราวหากไม่ได้ใช้ ใช้ Android 12 ข้อมูลแอป นำสิทธิ์ออกและเพิ่มพื้นที่ว่าง ใช้ Android 11 ข้อมูลแอป > สิทธิ์ นำสิทธิ์ออกหากไม่ได้ใช้งานแอป ใช้ Android 6.0 ถึง Android 10 (รวม) และ ขับเคลื่อนโดย Google Play บริการ แอป Play > เมนู > Play Protect > สิทธิ์สำหรับ ไม่ได้ใช้งาน แอป นำสิทธิ์ออกหากไม่ได้ใช้งานแอป
ตัวอย่างโค้ด API
ตัวอย่างโค้ดนี้จะแสดงวิธีตรวจสอบว่าได้เปิดใช้การไฮเบอร์เนตสำหรับ และวิธีที่ถูกต้องในการขอให้ผู้ใช้ปิดใช้งานการพักใช้งานสำหรับแอปของคุณ
Kotlin
val future: ListenableFuture<Int> = PackageManagerCompat.getUnusedAppRestrictionsStatus(context) future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context)) fun onResult(appRestrictionsStatus: Int) { when (appRestrictionsStatus) { // Couldn't fetch status. Check logs for details. ERROR -> { } // Restrictions don't apply to your app on this device. FEATURE_NOT_AVAILABLE -> { } // The user has disabled restrictions for your app. DISABLED -> { } // If the user doesn't start your app for a few months, the system will // place restrictions on it. See the API_* constants for details. API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus) } } fun handleRestrictions(appRestrictionsStatus: Int) { // If your app works primarily in the background, you can ask the user // to disable these restrictions. Check if you have already asked the // user to disable these restrictions. If not, you can show a message to // the user explaining why permission auto-reset or app hibernation should be // disabled. Then, redirect the user to the page in system settings where they // can disable the feature. val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName) // You must use startActivityForResult(), not startActivity(), even if // you don't use the result code returned in onActivityResult(). startActivityForResult(intent, REQUEST_CODE) }
API แพลตฟอร์มเดิม
ระบบปฏิบัติการยังมี API สำหรับโต้ตอบกับการพักใช้งาน อย่างไรก็ตาม API จะทำงานในอุปกรณ์ที่ใช้ Android 11 ขึ้นไปเท่านั้น API ไม่ได้จัดการฟีเจอร์การไฮเบอร์เนตที่ถูกย้อนกลับไปยังเวอร์ชันก่อนหน้า เวอร์ชัน Android ดังนั้น เราจึงไม่แนะนำให้ใช้ API
หากคุณต้องใช้ API นี้ชั่วคราวเพื่อความเข้ากันได้ รายการต่อไปนี้จะแสดงวิธีใช้
- หากต้องการตรวจสอบว่ามีการปิดใช้การพักการใช้งานสำหรับแอปของคุณหรือไม่
isAutoRevokeWhitelisted()
- หากต้องการส่งผู้ใช้ไปยังหน้าการตั้งค่าการพักใช้งาน ให้สร้าง Intent โดยใช้
ACTION_APPLICATION_DETAILS_SETTINGS
เรียกใช้ลักษณะการทำงานของการพักใช้งานด้วยตนเอง
เพื่อทดสอบลักษณะการทำงานของแอปหลังจากที่ระบบกำหนดให้แอปอยู่ในโหมดสลีป ให้ทำตามขั้นตอนต่อไปนี้
(Android 12 ขึ้นไปเท่านั้น) เปิดใช้ลักษณะการพักใช้งานใน อุปกรณ์:
adb shell device_config put app_hibernation app_hibernation_enabled true
ตั้งค่าระยะเวลาเริ่มต้นที่ระบบรอเพื่อเข้าสู่การพักใช้งาน วิธีนี้ช่วยให้คุณคืนค่าโปรไฟล์ได้หลังจากทดสอบแล้ว ดังนี้
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
ลดระยะเวลาที่ระบบรอ ในตัวอย่างต่อไปนี้ มีการแก้ไขระบบให้แอปของคุณเข้าสู่การพักใช้งานเพียง 1 วินาที หลังจากที่คุณหยุดโต้ตอบกับแอป
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
รอให้การออกอากาศตอนเปิดเครื่องเสร็จสิ้นในอุปกรณ์ทดสอบโดยเรียกใช้ คำสั่งต่อไปนี้
adb shell am wait-for-broadcast-idle
เมื่อการออกอากาศเสร็จสิ้น คำสั่งนี้จะแสดงข้อความดังนี้
All broadcast queues are idle!
เรียกใช้กระบวนการพักการใช้งานแอปด้วยตนเอง ดังนี้
adb shell cmd jobscheduler run -u 0 -f \ com.google.android.permissioncontroller 2
(Android 12 ขึ้นไปเท่านั้น) ตรวจสอบว่าแอปได้รับการพักใช้งานโดยใช้ วิธีการต่อไปนี้
- สังเกตว่าตอนนี้อุปกรณ์ทดสอบแสดงการแจ้งเตือน แอปที่ไม่ได้ใช้จะถูกพักการใช้งาน
เรียกใช้คำสั่งต่อไปนี้
adb shell cmd app_hibernation get-state PACKAGE-NAME
คืนค่าระยะเวลาเริ่มต้นให้ระบบรอก่อนที่จะเข้าสู่ ให้แอปของคุณอยู่ในโหมดสลีป:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold