Android:使用警报管理器定期获取电池状态

use*_*166 1 android battery broadcastreceiver alarmmanager android-intent

我希望定期获取Android设备的电池状态.

由于每隔几分钟轮询电池更换是一个坏主意,我想使用重复警报,可能每小时一次,可以调用一个获取当前电池状态的类.

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

android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents.
Run Code Online (Sandbox Code Playgroud)

警报超时时调用的类如下:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

这是我注册此接收器的点,抛出异常.

我理解异常是什么(我想!)但是我没有调用代码来从另一个接收器中注册粘性意图?

警报接收器调用另一个类,然后注册接收器以获得电池更改的意图....但显然这也是不允许的?

有什么选择?

此异常仅在某些设备上抛出,并且该应用程序在其他设备上正常工作?

Dav*_*ser 8

这实际上是一个Android bug.BroadcastReceiver在这种情况下,您实际上并没有尝试注册异步回调,但Android仍会抛出此异常.

绕过这个,而不是打电话

context.registerReceiver(null, ifilter);
Run Code Online (Sandbox Code Playgroud)

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

context.getApplicationContext().registerReceiver(null, ifilter);
Run Code Online (Sandbox Code Playgroud)

应用程序Context的生命周期比接收者的寿命长Context,因此允许呼叫.