ตรวจสอบระดับแบตเตอรี่และสถานะการชาร์จ

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

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

ในทำนองเดียวกัน คุณสามารถตรวจสอบระดับการชาร์จแบตเตอรี่ ซึ่งอาจลดความถี่หรือแม้กระทั่งหยุดการอัปเดตเมื่อแบตเตอรี่ใกล้จะหมด

ระบุสถานะการชาร์จปัจจุบัน

เริ่มต้นด้วยการตรวจสอบสถานะการเรียกเก็บเงินปัจจุบัน BatteryManager จะประกาศรายละเอียดแบตเตอรี่และการชาร์จทั้งหมดใน Intent แบบติดหนึบซึ่งมีสถานะการชาร์จ

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

Kotlin

val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->
    context.registerReceiver(null, ifilter)
}

Java

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

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

Kotlin

val status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
val isCharging: Boolean = status == BatteryManager.BATTERY_STATUS_CHARGING
        || status == BatteryManager.BATTERY_STATUS_FULL

// How are we charging?
val chargePlug: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1
val usbCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_USB
val acCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_AC

Java

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

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

ตรวจสอบการเปลี่ยนแปลงสถานะการชาร์จ

สถานะการชาร์จจึงเปลี่ยนแปลงได้ง่ายพอๆ กับเมื่อเสียบปลั๊กอุปกรณ์ คุณจึงจำเป็นต้องตรวจสอบสถานะการชาร์จเพื่อหาการเปลี่ยนแปลงและปรับอัตราการรีเฟรชให้สอดคล้องกัน

BatteryManager จะประกาศการดำเนินการทุกครั้งที่อุปกรณ์เชื่อมต่อหรือยกเลิกการเชื่อมต่อกับแหล่งจ่ายไฟ คุณควรรับเหตุการณ์เหล่านี้แม้ในขณะที่แอปไม่ได้ทํางานอยู่ โดยเฉพาะอย่างยิ่งเนื่องจากเหตุการณ์เหล่านี้ควรส่งผลต่อความถี่ที่คุณเริ่มแอปเพื่อเริ่มการอัปเดตในเบื้องหลัง คุณจึงควรลงทะเบียน BroadcastReceiver ในไฟล์ Manifest เพื่อฟังเหตุการณ์ทั้ง 2 รายการโดยกําหนด ACTION_POWER_CONNECTED และ ACTION_POWER_DISCONNECTED ภายในตัวกรอง Intent

<receiver android:name=".PowerConnectionReceiver">
  <intent-filter>
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  </intent-filter>
</receiver>

ดูระดับแบตเตอรี่ปัจจุบัน

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

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

Kotlin

val batteryPct: Float? = batteryStatus?.let { intent ->
    val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
    val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
    level * 100 / scale.toFloat()
}

Java

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level * 100 / (float)scale;

ตอบสนองต่อการเปลี่ยนแปลงที่สำคัญของระดับแบตเตอรี่

คุณไม่สามารถติดตามสถานะของแบตเตอรี่อย่างต่อเนื่องได้ง่ายๆ แต่ไม่จำเป็น

โดยทั่วไปแล้ว ผลจากการตรวจสอบระดับแบตเตอรี่จะมีผลกระทบ ต่อแบตเตอรี่มากกว่าพฤติกรรมปกติของแอป ตัวอย่างเช่น การลงทะเบียน BroadcastReceiver ในไฟล์ Manifest เพื่อยกเลิกงานที่รอดำเนินการเมื่อแบตเตอรี่เหลือน้อยจะยังคงแสดงให้แบตเตอรี่หมดเร็วยิ่งขึ้น (ดังนั้นจึงใช้ไม่ได้ตั้งแต่ Android 8.0) แต่คุณระบุข้อจำกัดเกี่ยวกับงานที่อธิบายเวลาที่ควรจะเรียกใช้ได้ ซึ่งช่วยให้ระบบตัดสินใจได้โดยไม่ต้องเริ่มแอป

โดยทั่วไปแล้ว คุณไม่ควรอัปเดตในเบื้องหลังเมื่อแบตเตอรี่เหลือน้อยมาก ไม่ว่าข้อมูลของคุณจะใหม่เพียงใดหากโทรศัพท์ปิดเองก่อนที่คุณจะนำมาใช้งานได้ หากต้องการดำเนินการ ให้ใช้ไลบรารี WorkManager ที่มี BatteryNotLow ข้อจำกัดเพื่อระบุว่าไม่ควรทำงานเมื่อแบตเตอรี่เหลือน้อย (นอกเหนือจากข้อจำกัด NetworkType ที่เกี่ยวข้อง)

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