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

หากแอปกำหนดเป้าหมายเป็น 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) หรือเครื่องมือจัดการรหัสผ่าน
  • ตัวรับสัญญาณการออกอากาศในแพ็กเกจที่รับการออกอากาศที่ชัดเจนจากแพ็กเกจภายนอก

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

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

การยกเว้นระบบจากการเข้าสู่โหมดสลีป

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

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