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

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

ผลกระทบต่ออายุการใช้งานแบตเตอรี่ของการอัปเดตแอปพลิเคชันจะขึ้นอยู่กับระดับแบตเตอรี่และ สถานะการชาร์จของอุปกรณ์ ผลกระทบของการอัปเดตขณะอุปกรณ์ชาร์จผ่าน 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)

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