doze android
Obtenga el nivel de baterĂa antes de que el receptor de broadcast responda por Intent.ACTION_BATTERY_CHANGED (6)
Tengo un receptor de transmisión en mi programa para reaccionar al nivel de la batería de la siguiente manera:
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));
Sin embargo, este código tiene que esperar a que se actualice el estado de la batería, de modo que si tiene un elemento de GUI que debe establecerse en función del nivel de la batería, debe esperar a que ocurra un evento de batería. ¿Hay alguna manera de empujar esto para que funcione o simplemente ejecutar algún código para ver cuál era el nivel de batería en la última emisión?
¿Hay alguna manera de empujar esto para que funcione o simplemente ejecutar algún código para ver cuál era el nivel de batería en la última emisión?
Puede llamar registerReceiver()
con su IntentFilter
y un BroadcastReceiver
null
para obtener la Intent
la última transmisión. Esto funciona porque ACTION_BATTERY_CHANGED
es una llamada "emisión adhesiva", que describo un poco más en esta pregunta y respuesta de .
Esta es la forma de obtener el nivel de batería sin registrar un receptor:
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;
}
Puede utilizar un BroadcastReceiver nulo debido a la naturaleza pegajosa de la transmisión.
Utiliza el truco getApplicationContext () en caso de que esté en un receptor intencionado y obtenga la excepción:
android.content.ReceiverCallNotAllowedException: los componentes de IntentReceiver no pueden registrarse para recibir intenciones
Tenga en cuenta que la intención que obtiene de registerReceiver call
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
puede ser nulo Por lo tanto, compruebe antes de usar el intento, por ejemplo
if(intent != null){
// do your stuff here...
}
Acabo de recibir una excepción de puntero nulo, ¡y la aplicación se cuelga!
Utilizo este método para obtener el nivel de batería sin recibir actualizaciones.
public float getMyBatteryLevel() {
Intent batteryIntent = this.getApplicationContext().registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return batteryIntent.getIntExtra("level", -1);
}
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));
}