doze android broadcastreceiver battery

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