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

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

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

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

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

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

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

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

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

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

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

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

การยกเว้นระบบจากการจำศีล

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

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