BroadcastReceiver 是不是只监听变化?
Posted
技术标签:
【中文标题】BroadcastReceiver 是不是只监听变化?【英文标题】: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
时,它是当前值还是上次更改时的值?我想检查它是否确实发生了变化以及它始终是什么,以便我可以优化我的应用程序并节省电池寿命。
【问题讨论】:
【参考方案1】:它只会在您指定的这些操作上被调用...
android.intent.action.ACTION_POWER_CONNECTED
android.intent.action.ACTION_POWER_DISCONNECTED
那时……
1) 外部电源已连接到设备。
2) 外部电源已从设备中移除。
如果您需要跟踪电池电量变化,则应在清单中包含此过滤器。
android.intent.action.ACTION_BATTERY_CHANGED
顺便说一句。
isCharging
当然是当前状态。
【讨论】:
所以如果我要创建一个像public boolean isCharging()
这样的方法,它会返回isCharging
。 isCharging()
可以随时调用,如果设备正在充电,它会准确返回吗?
我相信(几乎可以肯定:))它会。为什么不对其进行测试以确定?
isCharging
仅当在您调用 isCharging()
之前被调用 onReceive
时才会正确指示充电状态。您需要将您的isCharging
评估代码放入isCharging()
方法中。
P.S 我会创建一个帮助类,并且会巧妙地为特定的静态方法命名它。为了良好的设计,我不会将它与BroadcastReceiver
结合使用。
@AljoshBre 感谢您的提示,但评估代码取决于onReceive
中的Intent
【参考方案2】:
1. BroadcastReceiver
使用发布者-订阅者模式。
2.它是这样使用的..“如果发生xyz,请通知我,我将在此基础上采取行动”。
-
不仅是电池状态的变化,还有更多,比如当启动完成等...
更多详情请看这里:
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);
【讨论】:
以上是关于BroadcastReceiver 是不是只监听变化?的主要内容,如果未能解决你的问题,请参考以下文章
Android使用BroadcastReceiver监听网络状态