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() 这样的方法,它会返回isChargingisCharging()可以随时调用,如果设备正在充电,它会准确返回吗? 我相信(几乎可以肯定:))它会。为什么不对其进行测试以确定? 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 是不是只监听变化?的主要内容,如果未能解决你的问题,请参考以下文章

使用BroadcastReceiver监听系统接收的短信

Android使用BroadcastReceiver监听网络状态

Android使用BroadcastReceiver监听网络状态

BroadcastReceiver之应用卸载和安装监听

BroadcastReceiver之SD的挂载监听

利用CursorLoader实现短信验证码自动填写