2012-07-22 68 views
0

我在阅读指南here关于设置BroadcastReceiver来检查电池的变化。它说,我可以设置一个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,它会是当前值,还是最后一次更改的值?我想检查它是否发生了变化,并且始终如此以便我可以优化我的应用并节省电池寿命。

回答

2

为您指定将被调用只能在这些行动中,...

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

,这时候......

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

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

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

android.intent.action.ACTION_BATTERY_CHANGED

Btw。当然, isCharging将是当前状态。

+0

那么,如果我要创建像'方法public boolean isCharging()'并返回'isCharging'。可以随时调用isCharging(),那么如果设备正在充电,它会准确返回吗? – 2012-07-22 15:24:53

+0

我相信(几乎肯定:))它会。为什么不测试它是确定的? – nullpotent 2012-07-22 15:25:40

+0

只有在您调用'isCharging()'之前调用'onReceive','isCharging'才会正确指示充电状态。您需要将'isCharging'评估代码放在'isCharging()'方法中。 – nullpotent 2012-07-22 15:44:54

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