Android:使用alarm manager定期获取电池状态

Android:使用alarm manager定期获取电池状态,android,android-intent,broadcastreceiver,alarmmanager,battery,Android,Android Intent,Broadcastreceiver,Alarmmanager,Battery,我想定期获取Android设备的电池状态 因为每隔几分钟就对电池更换情况进行一次民意调查是个坏主意,所以我想使用一个可能每小时响一次的重复警报来调用一个获取当前电池状态的类 但是,我当前的实现给了我一个例外: android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents. 报警超时时调用的类如下所示: public

我想定期获取Android设备的电池状态

因为每隔几分钟就对电池更换情况进行一次民意调查是个坏主意,所以我想使用一个可能每小时响一次的重复警报来调用一个获取当前电池状态的类

但是,我当前的实现给了我一个例外:

android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents.
报警超时时调用的类如下所示:

public class GetBatteryStatusTimeout extends BroadcastReceiver{
    private static final String TAG = "GetBatteryStatusTimeout";
    @Override
    public void onReceive(Context context, Intent intent) {
        BatteryDataManager batteryData = new BatteryDataManager(context);
        batteryData.getStatus();
        Log.e(TAG, "GetBatteryStatus timer expired, getting status");
    }
}
getStatus()
方法调用代码以注册粘性意图并获取电池状态:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING;
boolean fullyCharged = status == BatteryManager.BATTERY_STATUS_FULL;
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
在我为这个接收者注册的时候,异常被抛出

我理解异常在说什么(我想!),但我不是在另一个接收者中调用代码来注册粘性意图

报警接收器调用另一个类,该类然后为电池更换意图注册接收器。。。。但显然这也是不允许的

替代方案是什么


此外,该异常仅在某些设备上引发,而该应用程序在其他设备上运行良好

这实际上是一个Android bug。在本例中,您实际上并没有尝试为异步回调注册
BroadcastReceiver
,但Android还是会抛出此异常

为了避开这件事,而不是打电话

context.registerReceiver(null, ifilter);
要获得粘性广播,请执行以下操作:

context.getApplicationContext().registerReceiver(null, ifilter);

应用程序
Context
的生存期比接收者的
Context
更长,因此允许调用。

这实际上是一个Android错误。在本例中,您实际上并没有尝试为异步回调注册
BroadcastReceiver
,但Android还是会抛出此异常

为了避开这件事,而不是打电话

context.registerReceiver(null, ifilter);
要获得粘性广播,请执行以下操作:

context.getApplicationContext().registerReceiver(null, ifilter);
应用程序
上下文
的生存期比接收方的
上下文
更长,因此将允许调用