【问题标题】:Does a BroadcastReceiver only listen to changes?BroadcastReceiver 是否只监听变化?
【发布时间】:2012-07-22 15:05:17
【问题描述】:

我正在阅读指南 here,关于设置 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 时,它是当前值还是上次更改时的值?我想检查它是否确实发生了变化以及它始终是什么,以便我可以优化我的应用程序并节省电池寿命。

【问题讨论】:

    标签: java android broadcastreceiver power-management


    【解决方案1】:

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

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

    那时……

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

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

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

    android.intent.action.ACTION_BATTERY_CHANGED

    顺便说一句。 isCharging 当然是当前状态。

    【讨论】:

    • 所以如果我要创建一个像public boolean isCharging() 这样的方法,它会返回isChargingisCharging()可以随时调用,如果设备正在充电,它会准确返回吗?
    • 我相信(几乎可以肯定:))它会。为什么不对其进行测试以确定?
    • isCharging 仅当在您调用 isCharging() 之前被调用 onReceive 时才会正确指示充电状态。您需要将您的isCharging 评估代码放入isCharging() 方法中。
    • P.S 我会创建一个帮助类,并且会巧妙地为特定的静态方法命名它。为了良好的设计,我不会将它与BroadcastReceiver 结合使用。
    • @AljoshBre 感谢您的提示,但评估代码取决于onReceive 中的Intent
    【解决方案2】:

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

    2.它是这样使用的..“如果发生xyz,请通知我,我将在此基础上采取行动”。

    1. 不仅是电池状态的变化,还有更多,比如当启动完成等...

    更多详情请看这里:

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

    【讨论】:

      【解决方案3】:

      这就是你想要的放在 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-13
        • 2013-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 2011-11-27
        相关资源
        最近更新 更多