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)
这是我注册此接收器的点,抛出异常.
我理解异常是什么(我想!)但是我没有调用代码来从另一个接收器中注册粘性意图?
警报接收器调用另一个类,然后注册接收器以获得电池更改的意图....但显然这也是不允许的?
有什么选择?
此异常仅在某些设备上抛出,并且该应用程序在其他设备上正常工作?
这实际上是一个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,因此允许呼叫.
| 归档时间: |
|
| 查看次数: |
1424 次 |
| 最近记录: |