Получите уровень заряда аккумулятора до ответа приемника на 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, который необходимо установить на основе уровня заряда батареи, он должен дождаться события батареи. Есть ли способ подтолкнуть это, чтобы заставить его работать или просто запустить некоторый код, чтобы узнать, какой уровень заряда батареи был в последней трансляции?
Ответы
Ответ 1
Есть ли способ подтолкнуть это, чтобы заставить его работать или просто запустить некоторый код, чтобы узнать, на что был установлен уровень заряда батареи последняя передача?
Вы можете позвонить registerReceiver()
с помощью IntentFilter
и null
BroadcastReceiver
, чтобы получить последнюю версию Intent
. Это работает, потому что ACTION_BATTERY_CHANGED
- это так называемая "липкая трансляция", которую я описываю немного в fooobar.com/questions/62525/....
Ответ 2
Как получить уровень заряда аккумулятора без регистрации приемника:
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(), если вы находитесь в приемнике намерений и получаете исключение:
android.content.ReceiverCallNotAllowedException: Компоненты IntentReceiver не являются разрешено регистрироваться для получения намерения
Ответ 3
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) + "%";
}
Ответ 4
// 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));
}
Ответ 5
Я использую этот метод для получения уровня заряда батареи без получения обновлений.
public float getMyBatteryLevel() {
Intent batteryIntent = this.getApplicationContext().registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return batteryIntent.getIntExtra("level", -1);
}
Ответ 6
Помните, что намерение, которое вы получаете от вызова registerReceiver
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
может быть нулевым. Поэтому, пожалуйста, сделайте чек перед использованием намерения, например.
if(intent != null){
// do your stuff here...
}
Я только что получил исключение нулевого указателя, из-за которого приложение вышло из строя!