【问题标题】:Android: Get Battery Status at regular intervals using alarm managerAndroid:使用警报管理器定期获取电池状态
【发布时间】:2013-11-30 22:28:00
【问题描述】:

我想定期获取 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() 方法调用代码注册粘性 Intent 并获取电池状态:

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 android-intent broadcastreceiver alarmmanager battery


    【解决方案1】:

    这实际上是一个 Android 错误。在这种情况下,您实际上并没有尝试为异步回调注册 BroadcastReceiver,但 Android 无论如何都会抛出此异常。

    为了解决这个问题,而不是调用

    context.registerReceiver(null, ifilter);
    

    要获得粘性广播,请执行以下操作:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      相关资源
      最近更新 更多