BroadcastReceiver是否只收听更改?

时间:2012-07-22 15:05:17

标签: java android broadcastreceiver power-management

我正在阅读有关设置BroadcastReceiver以检查电池更改的指南here。它声明我可以像这样设置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时,它会是当前值还是最后一次更改时的值?我想检查它是否确实发生了变化以及它总是如此,以便我可以优化我的应用程序并节省电池寿命。

3 个答案:

答案 0 :(得分:2)

只会在您指定的这些操作中调用它...

  1. android.intent.action.ACTION_POWER_CONNECTED
  2. android.intent.action.ACTION_POWER_DISCONNECTED
  3. 那就是......

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

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

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

    android.intent.action.ACTION_BATTERY_CHANGED

    顺便说一下。 当然,isCharging将是当前状态。

答案 1 :(得分:0)

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

2。以这种方式使用.. “如果xyz发生通知我,我将根据这一点采取行动”。

  1. 它不仅取决于电池状态的变化,还有更多,例如当启动完成等...
  2. 有关详细信息,请参阅此处:

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

答案 2 :(得分: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);