การพักใช้งานแอป

หากแอปกำหนดเป้าหมายเป็น Android 11 (ระดับ API 30) ขึ้นไป และผู้ใช้ไม่ได้โต้ตอบกับแอปเป็นเวลา 2-3 เดือน ระบบจะทำให้แอปอยู่ในสถานะการพักใช้งาน ระบบจะเพิ่มประสิทธิภาพพื้นที่เก็บข้อมูลแทนประสิทธิภาพ และระบบจะปกป้องข้อมูลผู้ใช้ ลักษณะการทำงานของระบบนี้คล้ายกับสิ่งที่เกิดขึ้นเมื่อผู้ใช้บังคับให้แอปของคุณหยุดทำงานด้วยตนเองจากการตั้งค่าระบบ

ผลของการไฮเบอร์เนต

ดังที่แสดงในตารางที่ 1 ผลกระทบของการไฮเบอร์เนตจะขึ้นอยู่กับเวอร์ชัน SDK เป้าหมายของแอป รวมถึงอุปกรณ์ที่แอปทำงานอยู่

ตารางที่ 1 ผลกระทบของการเข้าสู่โหมดไฮเบอร์เนตต่อแอป
เวอร์ชัน 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 ดูข้อมูลเพิ่มเติมในบล็อกโพสต์นี้เกี่ยวกับการทำให้การรีเซ็ตสิทธิ์อัตโนมัติพร้อมใช้งานในอุปกรณ์อีกหลายพันล้านเครื่อง

ลักษณะการทำงานของระบบเมื่อแอปออกจากโหมดไฮเบอร์เนต

เมื่อผู้ใช้โต้ตอบกับแอปของคุณในครั้งถัดไป แอปจะออกจากโหมดไฮเบอร์เนต และจะสร้างงาน การแจ้งเตือน และการแจ้งเตือนได้อีกครั้ง

อย่างไรก็ตาม ระบบจะไม่ดำเนินการต่อไปนี้สำหรับแอปของคุณ

  1. ให้สิทธิ์รันไทม์ของแอปอีกครั้ง

    ผู้ใช้ต้องให้สิทธิ์เหล่านี้แก่แอปของคุณอีกครั้ง

  2. กำหนดเวลางาน การแจ้งเตือน และการแจ้งเตือนที่กำหนดเวลาไว้ก่อนที่แอปจะเข้าสู่โหมดไฮเบอร์เนตใหม่

    ใช้ WorkManager เพื่อรองรับเวิร์กโฟลว์นี้ได้ง่ายขึ้น นอกจากนี้ คุณยังเพิ่มตรรกะการกำหนดเวลาใหม่ใน Broadcast Receiver ACTION_BOOT_COMPLETED ซึ่งจะเรียกใช้เมื่อแอปออกจากโหมดไฮเบอร์เนตและหลังจากอุปกรณ์เปิดเครื่องได้ด้วย

การใช้งานแอป

ส่วนต่อไปนี้แสดงตัวอย่างการใช้งานแอป รวมถึงตัวอย่างการดำเนินการที่ระบบไม่ถือว่าเป็นการใช้งานแอป

ตัวอย่างการใช้งานแอป

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

ใน Android 11 ขึ้นไป ระบบจะถือว่าพฤติกรรมต่อไปนี้เป็นการโต้ตอบของผู้ใช้ด้วย

  • ผู้ใช้โต้ตอบกับวิดเจ็ต
  • ผู้ใช้โต้ตอบกับการแจ้งเตือน ยกเว้นการปิดการแจ้งเตือน

โปรดทราบว่าการใช้งานแอปสำหรับโหมดไฮเบอร์เนตไม่จำเป็นต้องมีการโต้ตอบของผู้ใช้อย่างชัดแจ้ง ตราบใดที่มีการเรียกใช้คอมโพเนนต์ของแพ็กเกจ ระบบจะยังคงถือว่าเป็นการใช้งานแอป ตัวอย่างของเนื้อหาประเภทนี้ ได้แก่

  • แอปที่มีบริการหรือ Content Provider ที่เชื่อมโยงกับแอปอื่นในอุปกรณ์หรือระบบปฏิบัติการ เช่น ตัวแก้ไขวิธีการป้อนข้อมูล (IME) หรือเครื่องมือจัดการรหัสผ่าน
  • Broadcast Receiver ในแพ็กเกจที่รับการออกอากาศที่ชัดเจนจากแพ็กเกจภายนอก

ตัวอย่างที่ไม่ใช่

หากแอปของคุณแสดงเฉพาะลักษณะการทำงานที่อธิบายไว้ในรายการต่อไปนี้ แอปจะเข้าสู่โหมดไฮเบอร์เนตหลังจากผ่านไป 2-3 เดือน

การยกเว้นระบบจากการเข้าสู่โหมดไฮเบอร์เนต

Android ให้การยกเว้นระดับระบบจากการพักใช้งานแอปในบางกรณีการใช้งาน หากแอปของคุณอยู่ในหมวดหมู่ใดหมวดหมู่หนึ่งต่อไปนี้ แอปจะได้รับการยกเว้นจากมาตรฐานการใช้งานแอปและจะไม่เข้าสู่โหมดไฮเบอร์เนต

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

การยกเว้นผู้ใช้จากการเข้าสู่โหมดไฮเบอร์เนต

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

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

หากต้องการขอการยกเว้น ให้ทำตามขั้นตอนในส่วนต่อไปนี้

ตรวจสอบว่าผู้ใช้ปิดใช้โหมดไฮเบอร์เนตสำหรับแอปของคุณแล้วหรือยัง

หากต้องการตรวจสอบว่าผู้ใช้ปิดใช้โหมดไฮเบอร์เนตสำหรับแอปของคุณแล้วหรือยัง ให้ใช้ API getUnusedAppRestrictionsStatus()

ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ API นี้ในแอปได้ที่ตัวอย่างโค้ด API ในหน้านี้

ขอให้ผู้ใช้ปิดใช้โหมดไฮเบอร์เนตสำหรับแอปของคุณ

หากผู้ใช้ยังไม่ได้ปิดใช้โหมดไฮเบอร์เนตสำหรับแอปของคุณ คุณสามารถส่งคำขอไปยังผู้ใช้ได้ โดยทำตามขั้นตอนต่อไปนี้

  1. แสดง UI ที่อธิบายให้ผู้ใช้ทราบถึงเหตุผลที่ต้องปิดใช้การไฮเบอร์เนตสำหรับแอปของคุณ
  2. เรียกใช้ 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

เรียกใช้ลักษณะการทำงานของการจำศีลด้วยตนเอง

หากต้องการทดสอบลักษณะการทำงานของแอปหลังจากที่ระบบทำให้แอปอยู่ในสถานะไฮเบอร์เนต ให้ทำตามขั้นตอนต่อไปนี้

  1. (Android 12 ขึ้นไปเท่านั้น) เปิดใช้ลักษณะการทำงานของโหมดไฮเบอร์เนตในอุปกรณ์โดยทำดังนี้

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. ตั้งค่าระยะเวลาเริ่มต้นที่ระบบจะรอก่อนเข้าสู่โหมดไฮเบอร์เนต วิธีนี้จะช่วยให้คุณกู้คืนข้อมูลได้หลังจากการทดสอบ โดยทำดังนี้

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. ลดระยะเวลาที่ระบบรอ ในตัวอย่างต่อไปนี้ ระบบได้รับการแก้ไขเพื่อให้แอปเข้าสู่โหมดไฮเบอร์เนตเพียง 1 วินาทีหลังจากที่คุณหยุดโต้ตอบกับแอป

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. รอให้การออกอากาศเวลาเปิดเครื่องเสร็จสิ้นในอุปกรณ์ทดสอบโดยเรียกใช้คำสั่งต่อไปนี้

    adb shell am wait-for-broadcast-idle
    

    เมื่อการประกาศเสร็จสิ้น คำสั่งนี้จะแสดงข้อความต่อไปนี้ All broadcast queues are idle!

  5. เรียกใช้กระบวนการพักใช้งานแอปด้วยตนเองโดยทำดังนี้

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Android 12 ขึ้นไปเท่านั้น) ยืนยันว่าแอปอยู่ในโหมดไฮเบอร์เนตโดยใช้วิธีใดวิธีหนึ่งต่อไปนี้

    • สังเกตว่าอุปกรณ์ทดสอบแสดงการแจ้งเตือนที่ระบุว่าแอปที่ไม่ได้ใช้จะเข้าสู่โหมดไฮเบอร์เนต
    • เรียกใช้คำสั่งต่อไปนี้

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. คืนค่าระยะเวลาเริ่มต้นที่ระบบจะรอก่อนที่จะทำให้แอปเข้าสู่โหมดไฮเบอร์เนต

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold