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

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

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

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