Android中android.intent.action.BATTERY_CHANGED广播接收器失效求助
解决
android.intent.action.BATTERY_CHANGED广播接收器不触发的问题 你的问题核心在于:android.intent.action.BATTERY_CHANGED这个系统广播是不支持通过Manifest静态注册的,Android系统只会把这个广播发送给动态注册的BroadcastReceiver,所以你在Manifest里配置的接收器永远不会被触发。
接下来给你具体的修复步骤:
1. 移除Manifest中的静态接收器配置
先把你Manifest里的<receiver>代码删掉,因为它对这个广播完全无效:
<!-- 删掉这段无效代码 --> <receiver android:name=".Receiver" android:exported="true" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.BATTERY_CHANGED"/> </intent-filter> </receiver>
2. 动态注册BroadcastReceiver
你需要在Activity、Service或者其他生命周期可控的组件里动态注册接收器,比如在Activity的onCreate方法中注册,在onDestroy中注销(避免内存泄漏)。
举个Activity的示例代码:
public class MainActivity extends AppCompatActivity { private Receiver batteryReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化接收器并完成注册 batteryReceiver = new Receiver(); IntentFilter batteryFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); registerReceiver(batteryReceiver, batteryFilter); } @Override protected void onDestroy() { super.onDestroy(); // 一定要注销接收器,防止内存泄漏 if (batteryReceiver != null) { unregisterReceiver(batteryReceiver); } } }
3. 优化你的Receiver逻辑(可选)
你的Receiver核心逻辑是正常的,这里可以补充一些细节让功能更完善:
public class Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收器已触发!", Toast.LENGTH_SHORT).show(); // 判断电池是否处于充电/满电状态 int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isChargingOrFull = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // 判断充电类型 int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean isAcCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; boolean isUsbCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean isWirelessCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_WIRELESS; boolean isCharging = isChargingOrFull || isAcCharging || isUsbCharging || isWirelessCharging; if (isCharging) { String chargeType = isAcCharging ? "AC电源" : isUsbCharging ? "USB" : isWirelessCharging ? "无线充电" : "未知方式"; Toast.makeText(context, "电池正在通过" + chargeType + "充电", Toast.LENGTH_LONG).show(); Log.d("BatteryReceiver", "充电状态触发:" + chargeType); } } }
为什么静态注册不行?
Android系统为了优化性能和减少不必要的资源占用,对部分高频发送的系统广播做了限制——ACTION_BATTERY_CHANGED会在电池状态(电量、充电状态)变化时频繁触发,所以系统只允许动态注册的接收器接收,避免静态注册的接收器长期驻留占用资源。
如果需要在后台持续监听充电状态,你可以考虑使用前台服务结合动态注册(注意Android 8.0及以上的后台限制,普通后台Service可能会被系统杀死)。
内容的提问来源于stack exchange,提问作者ScarySneer
相关产品推荐
相关产品推荐

