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