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

หากแอปของคุณกำหนดเป้าหมายเป็น 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 ขึ้นไป ระบบจะพิจารณาพฤติกรรมต่อไปนี้เป็นการโต้ตอบของผู้ใช้ด้วย

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

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

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

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

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

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

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

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