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