J'ai un récepteur de diffusion dans mon programme pour réagir au niveau de la batterie, comme ceci:
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));
Toutefois, ce code doit attendre que l'état de la batterie soit mis à jour. Par conséquent, si vous devez définir un élément de l'interface graphique en fonction du niveau de la batterie, il doit attendre qu'un événement de batterie se produise. Existe-t-il un moyen de calmer cela pour le faire fonctionner ou simplement d’exécuter du code pour voir quel était le niveau de charge de la batterie lors de la dernière diffusion?
Y at-il un moyen de Nudge cela pour le faire fonctionner ou simplement exécuter un code pour voir ce que le niveau de la batterie était sur la dernière émission?
Vous pouvez appeler registerReceiver()
avec votre IntentFilter
et votre null
BroadcastReceiver
pour obtenir la dernière variable Intent
. Cela fonctionne parce que ACTION_BATTERY_CHANGED
est une soi-disant "diffusion persistante", que je décris un peu plus dans cette question StackOverflow .
Voici comment obtenir le niveau de la batterie sans enregistrer un récepteur:
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;
}
Il peut utiliser un BroadcastReceiver nul en raison de la nature collante de la diffusion.
Il utilise l'astuce getApplicationContext () au cas où vous vous trouvez dans un destinataire d'intention et obtenez l'exception:
Android.content.ReceiverCallNotAllowedException: Les composants IntentReceiver ne sont pas autorisé à vous inscrire pour recevoir l'intention
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));
}
J'utilise cette méthode pour obtenir le niveau de la batterie sans recevoir de mises à jour.
public float getMyBatteryLevel() {
Intent batteryIntent = this.getApplicationContext().registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return batteryIntent.getIntExtra("level", -1);
}
S'il vous plaît être conscient, que l'intention que vous obtenez de registerReceiver appel
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
peut être nul. Alors s'il vous plaît faire une vérification avant d'utiliser l'intention, par exemple.
if(intent != null){
// do your stuff here...
}
Je viens de recevoir une exception de pointeur null, provoquant le blocage de l'application!