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

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

ผลของการพักการใช้งาน

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

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

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

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

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

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

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

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

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

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

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

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

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

ใน Android 11 ขึ้นไป ลักษณะการทำงานต่อไปนี้มีดังนี้ ที่ถือว่าเป็นการโต้ตอบของผู้ใช้:

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

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

  • แอปที่มีบริการหรือผู้ให้บริการเนื้อหาที่ผูกกับแอปอื่นในอุปกรณ์ หรือระบบปฏิบัติการ เช่น Input Method Editor (IME) หรือเครื่องมือจัดการรหัสผ่าน
  • เครื่องรับสัญญาณประกาศในแพ็กเกจที่ได้รับการออกอากาศที่ชัดเจนจาก แพ็กเกจภายนอก

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

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

การยกเว้นระบบจากการพักการใช้งาน

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

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

การยกเว้นของผู้ใช้จากการพักการใช้งาน

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

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

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

ตรวจสอบว่าผู้ใช้ปิดใช้งานการพักใช้งานสำหรับแอปของคุณแล้วหรือยัง

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

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ 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 นี้ชั่วคราวเพื่อความเข้ากันได้ รายการต่อไปนี้จะแสดงวิธีใช้

  • หากต้องการตรวจสอบว่ามีการปิดใช้การพักการใช้งานสำหรับแอปของคุณหรือไม่ 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