หากแอปกำหนดเป้าหมายเป็น Android 11 (ระดับ API 30) ขึ้นไป และผู้ใช้ไม่ได้โต้ตอบกับแอปเป็นเวลา 2-3 เดือน ระบบจะทำให้แอปอยู่ในสถานะการพักใช้งาน ระบบจะเพิ่มประสิทธิภาพพื้นที่เก็บข้อมูลแทนประสิทธิภาพ และระบบจะปกป้องข้อมูลผู้ใช้ ลักษณะการทำงานของระบบนี้คล้ายกับสิ่งที่เกิดขึ้นเมื่อผู้ใช้บังคับให้แอปของคุณหยุดทำงานด้วยตนเองจากการตั้งค่าระบบ
ผลของการไฮเบอร์เนต
ดังที่แสดงในตารางที่ 1 ผลกระทบของการไฮเบอร์เนตจะขึ้นอยู่กับเวอร์ชัน SDK เป้าหมายของแอป รวมถึงอุปกรณ์ที่แอปทำงานอยู่
| เวอร์ชัน SDK เป้าหมาย | ลักษณะเฉพาะของอุปกรณ์ | เอฟเฟกต์การจำศีล |
|---|---|---|
| Android 12 ขึ้นไป | ใช้ Android 12 ขึ้นไป |
ระบบจะรีเซ็ตสิทธิ์รันไทม์ของแอป การดำเนินการนี้มีผลเช่นเดียวกับกรณีที่ผู้ใช้ดูสิทธิ์ในการตั้งค่าระบบและเปลี่ยนระดับการเข้าถึงของแอปเป็นปฏิเสธ แอปของคุณไม่สามารถเรียกใช้งานหรือการแจ้งเตือนจากเบื้องหลังได้ แอปของคุณจะรับข้อความ Push ไม่ได้ ซึ่งรวมถึงข้อความที่มีลำดับความสำคัญสูงที่ส่งผ่าน Firebase Cloud Messaging ระบบจะนำไฟล์ทั้งหมดในแคชของแอปออก |
| Android 11 | ใช้ Android 11 | ระบบจะรีเซ็ตสิทธิ์รันไทม์ของแอป |
| Android 11 | ใช้ Android 6.0 (ระดับ API 23) ถึง Android 10 (ระดับ API 29) รวมทั้งขับเคลื่อนโดยบริการ Google Play |
ระบบจะรีเซ็ตสิทธิ์รันไทม์ของแอป ลักษณะการทำงานนี้จะมีผลในเดือนธันวาคม 2021 ดูข้อมูลเพิ่มเติมในบล็อกโพสต์นี้เกี่ยวกับการทำให้การรีเซ็ตสิทธิ์อัตโนมัติพร้อมใช้งานในอุปกรณ์อีกหลายพันล้านเครื่อง |
ลักษณะการทำงานของระบบเมื่อแอปออกจากโหมดไฮเบอร์เนต
เมื่อผู้ใช้โต้ตอบกับแอปของคุณในครั้งถัดไป แอปจะออกจากโหมดไฮเบอร์เนต และจะสร้างงาน การแจ้งเตือน และการแจ้งเตือนได้อีกครั้ง
อย่างไรก็ตาม ระบบจะไม่ดำเนินการต่อไปนี้สำหรับแอปของคุณ
ให้สิทธิ์รันไทม์ของแอปอีกครั้ง
ผู้ใช้ต้องให้สิทธิ์เหล่านี้แก่แอปของคุณอีกครั้ง
กำหนดเวลางาน การแจ้งเตือน และการแจ้งเตือนที่กำหนดเวลาไว้ก่อนที่แอปจะเข้าสู่โหมดไฮเบอร์เนตใหม่
ใช้ WorkManager เพื่อรองรับเวิร์กโฟลว์นี้ได้ง่ายขึ้น นอกจากนี้ คุณยังเพิ่มตรรกะการกำหนดเวลาใหม่ใน Broadcast Receiver
ACTION_BOOT_COMPLETEDซึ่งจะเรียกใช้เมื่อแอปออกจากโหมดไฮเบอร์เนตและหลังจากอุปกรณ์เปิดเครื่องได้ด้วย
การใช้งานแอป
ส่วนต่อไปนี้แสดงตัวอย่างการใช้งานแอป รวมถึงตัวอย่างการดำเนินการที่ระบบไม่ถือว่าเป็นการใช้งานแอป
ตัวอย่างการใช้งานแอป
เมื่อกิจกรรมในแอปกลับมาทำงานอีกครั้ง ระบบจะถือว่าเหตุการณ์นี้เป็นการโต้ตอบของผู้ใช้ ดังนั้น ระบบจึงขยายระยะเวลาก่อนที่แอปจะเข้าสู่โหมดไฮเบอร์เนต
ใน Android 11 ขึ้นไป ระบบจะถือว่าพฤติกรรมต่อไปนี้เป็นการโต้ตอบของผู้ใช้ด้วย
- ผู้ใช้โต้ตอบกับวิดเจ็ต
ผู้ใช้โต้ตอบกับการแจ้งเตือน ยกเว้นการปิดการแจ้งเตือน
โปรดทราบว่าการใช้งานแอปสำหรับโหมดไฮเบอร์เนตไม่จำเป็นต้องมีการโต้ตอบของผู้ใช้อย่างชัดแจ้ง ตราบใดที่มีการเรียกใช้คอมโพเนนต์ของแพ็กเกจ ระบบจะยังคงถือว่าเป็นการใช้งานแอป ตัวอย่างของเนื้อหาประเภทนี้ ได้แก่
- แอปที่มีบริการหรือ Content Provider ที่เชื่อมโยงกับแอปอื่นในอุปกรณ์หรือระบบปฏิบัติการ เช่น ตัวแก้ไขวิธีการป้อนข้อมูล (IME) หรือเครื่องมือจัดการรหัสผ่าน
Broadcast Receiver ในแพ็กเกจที่รับการออกอากาศที่ชัดเจนจากแพ็กเกจภายนอก
ตัวอย่างที่ไม่ใช่
หากแอปของคุณแสดงเฉพาะลักษณะการทำงานที่อธิบายไว้ในรายการต่อไปนี้ แอปจะเข้าสู่โหมดไฮเบอร์เนตหลังจากผ่านไป 2-3 เดือน
- เรียกใช้งานที่กำหนดเวลาไว้โดยใช้
JobScheduler - รับการกระจายข้อมูลแบบไม่เจาะจงปลายทาง
- ตั้งเวลาปลุก
การยกเว้นระบบจากการเข้าสู่โหมดไฮเบอร์เนต
Android ให้การยกเว้นระดับระบบจากการพักใช้งานแอปในบางกรณีการใช้งาน หากแอปของคุณอยู่ในหมวดหมู่ใดหมวดหมู่หนึ่งต่อไปนี้ แอปจะได้รับการยกเว้นจากมาตรฐานการใช้งานแอปและจะไม่เข้าสู่โหมดไฮเบอร์เนต
- แอปไม่แสดงใน Launcher
- แอปที่ไม่มีการ์ดทางลัดที่ใช้งานอยู่ใน Launcher
- แอปในโปรไฟล์งาน
- แอปที่ผู้ใช้ติดตั้งในโปรไฟล์งาน โปรดทราบว่าหากแอปเดียวกันอยู่ในโปรไฟล์ส่วนตัวด้วย ระบบจะยกเว้นเฉพาะแอปในโปรไฟล์งานเท่านั้น
- เครื่องมือควบคุมนโยบายด้านอุปกรณ์
- แอปที่ควบคุมนโยบายด้านอุปกรณ์ในเครื่องและแอปพลิเคชันระบบในอุปกรณ์
- แอปที่มีสิทธิ์ของผู้ให้บริการ
- แอปใดก็ตามที่ผู้ให้บริการเครือข่ายมือถือโหลดไว้ล่วงหน้าในอุปกรณ์และเห็นว่าจำเป็นสำหรับภาระหน้าที่ในการให้บริการตามสัญญา เช่น แอปข้อความเสียงหรือแอปฝ่ายบริการลูกค้า
- แอปโปรแกรมติดตั้งของบุคคลที่สาม
- App Store ของบุคคลที่สามสำหรับการอัปเดตแอปที่ติดตั้งไว้โดยอัตโนมัติเมื่อจำเป็น
การยกเว้นผู้ใช้จากการเข้าสู่โหมดไฮเบอร์เนต
หากคาดว่า Use Case หลักในแอปจะได้รับผลกระทบจากการพักใช้งาน คุณสามารถขอการยกเว้นการพักใช้งานแอปจากผู้ใช้ได้ การยกเว้นนี้มีประโยชน์ในสถานการณ์ที่ผู้ใช้คาดหวังให้แอปทำงานในเบื้องหลังเป็นหลัก แม้ว่าผู้ใช้จะไม่ได้โต้ตอบกับแอปก็ตาม เช่น เมื่อแอปทำสิ่งต่อไปนี้
- ดูแลความปลอดภัยของครอบครัวด้วยการรายงานตำแหน่งของสมาชิกในครอบครัวเป็นระยะๆ
- ซิงค์ข้อมูลระหว่างอุปกรณ์กับเซิร์ฟเวอร์ของแอป
- สื่อสารกับอุปกรณ์อัจฉริยะ เช่น ทีวี
- จับคู่กับอุปกรณ์ที่ใช้ร่วมกัน เช่น นาฬิกา
หากต้องการขอการยกเว้น ให้ทำตามขั้นตอนในส่วนต่อไปนี้
ตรวจสอบว่าผู้ใช้ปิดใช้โหมดไฮเบอร์เนตสำหรับแอปของคุณแล้วหรือยัง
หากต้องการตรวจสอบว่าผู้ใช้ปิดใช้โหมดไฮเบอร์เนตสำหรับแอปของคุณแล้วหรือยัง ให้ใช้ API getUnusedAppRestrictionsStatus()
ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ 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 ต่อไปชั่วคราวเพื่อวัตถุประสงค์ด้านความเข้ากันได้ รายการต่อไปนี้จะแสดงวิธีใช้ 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