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

我在我的程序中有一个广播接收器来响应电池电量,如下所示:

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)); 

但是,此代码必须等待更新电池状态,因此如果您需要根据电池电量设置GUI元素,则必须等待电池事件发生。 有没有办法推动这个工作,或只是运行一些代码,看看最后一次广播的电池水平是什么?

有没有办法推动这个工作,或只是运行一些代码,看看最后一次广播的电池水平是什么?

你可以用你的IntentFilter和一个null BroadcastReceiver来调用registerReceiver()来得到最后的广播Intent 。 这是有效的,因为ACTION_BATTERY_CHANGED是一个所谓的“粘性广播”,我在这个StackOverflow问题和答案中多描述一下。

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

 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; } 

由于广播的粘性,它可以使用空的BroadcastReceiver。

它使用getApplicationContext()技巧,以防止您处于意图接收方并获取exception:

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

  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) + "%"; } 
 // Put this Code into your MainActivity private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() { @Override public void onReceive(Context c, Intent i) { int level = i.getIntExtra("level", 0); ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar); pb.setProgress(level); TextView tv = (TextView) findViewById(R.id.textfield); tv.setText("Battery Level: " + Integer.toString(level) + "%"); } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); registerReceiver(mBatInfoReceiver, new IntentFilter( Intent.ACTION_BATTERY_CHANGED)); } 

我使用这种方法来获取电池电量而不接收更新。

 public float getMyBatteryLevel() { Intent batteryIntent = this.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); return batteryIntent.getIntExtra("level", -1); } 

请注意,你从registerReceiver调用的意图

 Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

可以为null。 所以请在使用意图之前进行检查,例如

 if(intent != null){ // do your stuff here... } 

我刚刚得到一个空指针exception,导致应用程序崩溃!

Interesting Posts