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

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

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

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

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

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

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

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

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

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

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

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

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

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

แอปไม่แสดงบน 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