在广播接收器响应Intent.ACTION_BATTERY_CHANGED之前获得电池电量

ste*_*ter 41 android battery broadcastreceiver

我的程序中有一个广播接收器,可以像这样对电池电量做出反应:

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent intent) {
        int level = intent.getIntExtra("level", 0);
        // do something...
    }
}

    registerReceiver(this.mBatInfoReceiver, 
            new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
Run Code Online (Sandbox Code Playgroud)

但是,此代码必须等待更新电池状态,因此如果您有一个需要根据电池电量设置的GUI元素,则必须等待电池事件发生.有没有办法轻推它以使其正常工作或只是运行一些代码来查看最后一次广播的电池电量是多少?

小智 84

这是如何在不注册接收器的情况下获得电池电量:

Intent batteryIntent = context.getApplicationContext().registerReceiver(null,
                    new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int rawlevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
double scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
double level = -1;
if (rawlevel >= 0 && scale > 0) {
    level = rawlevel / scale;
}
Run Code Online (Sandbox Code Playgroud)

由于广播的粘性,它可以使用null BroadcastReceiver.

它使用getApplicationContext()技巧,以防你在intent接收器中并获得异常:

android.content.ReceiverCallNotAllowedException:不允许IntentReceiver组件注册接收意图


Com*_*are 37

有没有办法轻推它以使其正常工作或只是运行一些代码来查看最后一次广播的电池电量是多少?

你可以叫registerReceiver()IntentFilternull BroadcastReceiver得到最后的广播Intent.这是有效的,因为这ACTION_BATTERY_CHANGED是一个所谓的"粘性广播",我在这个StackOverflow问答中更多地描述了它.

  • @Mayra:`getApplicationContext()`在这里应该没问题,特别是如果你试图从`BroadcastReceiver`这样做的话. (6认同)
  • 实际上我在问题中的接收器一旦被创建就被调用我只是没有注意到因为我重新初始化了它之后的变量. (3认同)

XXX*_*XXX 5

    public static String batteryLevel(Context context)
    {
        Intent intent  = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));   
        int    level   = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
        int    scale   = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
        int    percent = (level*100)/scale;
        return String.valueOf(percent) + "%";
    }
Run Code Online (Sandbox Code Playgroud)