当电池电量不足时,Android 将发送一个 ACTION_BATTERY_LOW 意图。然后当它再次正常时,它会发送 ACTION_BATTERY_OKAY。
不幸的是,如果我的应用程序在电池电量不足时启动,那么我不会收到意图;它不粘,所以我无法检测当前是否存在电池警报。ACTION_BATTERY_CHANGED是粘性的,但它只告诉我当前的电池充电状态,而不是系统是否已宣布低电量警报。
有没有办法在任何给定的时刻检测电池是否电量不足?
这是一个非常棘手的问题。Android Developer 上的相关代码有错误。
基本上,您可以在此链接上了解如何检测它:
https://developer.android.com/training/monitoring-device-state/battery-monitoring.html
您可以使用 OnReceive(Context context, Intent intent){} 方法通过广播接收器检测它是否正在充电和电池电量不足
但是,这个链接有一个错误,用于监控重大变化。[注意这里,动作名称是android.intent.action.ACTION_BATTERY_LOW]
[1]
但是让我们看看它是如何在 Intent 中描述的。
ACTION_BATTERY_LOW
在 API 级别 1 中添加字符串 ACTION_BATTERY_LOW 广播操作:指示设备上的电池电量不足。该广播对应于“低电量警告”系统对话框。
这是一个只能由系统发送的受保护意图。
常量值:“android.intent.action.BATTERY_LOW” 你可以在 Android Developers Intent 中找到它。
换句话说,这里发生了错误。它应该是 action.BATTERY_LOW 而不是 action.ACTION_BATTERY_LOW。所以你在 AndroidManifest 中的代码应该是:
<receiver android:name=".receiver.BatteryLevelReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_LOW"/>
<!--instead of android.intent.action.ACTION_BATTERY_LOW-->
</intent-filter>
</receiver>
还要确保您的接收器正确。
public class BatteryLevelReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "BAttery's dying!!", Toast.LENGTH_LONG).show();
Log.e("", "BATTERY LOW!!");
}
}
在笔记本电脑上调试或登录很困难,使用 Toast 可能会有所帮助。
Toast.makeText(context, "BAttery's dying!!", Toast.LENGTH_LONG).show();
//Toast.makeText(Context context, String str, Integer integer).show();
希望它有助于解决您的问题。
粘性意图仍然包含一些信息。您仍然应该能够获得电池电量
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;
取自http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
通常低电量警告出现在 15% 时,因此您可以检查电池电量是否等于或低于 15%。