0

我在这里阅读了有关设置BroadcastReceiver检查电池变化的指南。它说我可以设置一个BroadcastReceiver这样的:

<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>

在我的清单中,这是一个类:

public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) { 
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                        status == BatteryManager.BATTERY_STATUS_FULL;

        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
    }
}

是否仅在电池状态发生变化时才BroadcastReceiver通话?onReceive(...)例如,如果用户将设备插入他们的计算机并且它在整个BroadcastReceiver运行期间都在充电怎么办。它会检测到变化吗,因为从技术上讲,设备的电池状态没有改变?每当我得到isCharging时,它会是当前值,还是上次更改时的值?我想检查它是否确实发生了变化以及它始终是什么,以便我可以优化我的应用程序并节省电池寿命。

4

3 回答 3

2

正如您指定的那样,它只会在这些操作上被调用......

  1. android.intent.action.ACTION_POWER_CONNECTED
  2. android.intent.action.ACTION_POWER_DISCONNECTED

而那时...

1)外部电源已连接到设备。

2)外部电源已从设备中移除。

如果您需要跟踪电池电量的变化,您应该在清单中包含此过滤器。

android.intent.action.ACTION_BATTERY_CHANGED

顺便提一句。 isCharging当然,将是当前状态。

于 2012-07-22T15:12:27.707 回答
0

1. BroadcastReceiver使用发布者-订阅者模式。

2.它以这种方式使用.. “如果发生xyz通知我,我将在此基础上采取行动”。

  1. 它不仅在电池状态的变化上,而且还有更多,比如当启动完成时等等......

有关更多详细信息,请参见:

http://developer.android.com/reference/android/content/BroadcastReceiver.html

于 2012-07-22T15:14:17.173 回答
0

这就是你想把它放在 onCreate 方法中

BroadcastReceiver batteryReceiver = new BroadcastReceiver() 
        {
            int scale = -1;

            int level = -1;

            int voltage = -1;

            int temp = -1;

            @Override
            public void onReceive(Context context, Intent intent) 
            {
                level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);

                scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

                temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);

                voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);

                Log.e("BatteryManager", "level is "+level+"/"+scale+", temp is "+temp+", voltage is "+voltage);
            }    
        };

            IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

            registerReceiver(batteryReceiver, filter);
于 2014-12-23T09:06:57.460 回答