Подтвердить что ты не робот

Получите уровень заряда аккумулятора до ответа приемника на 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, который необходимо установить на основе уровня заряда батареи, он должен дождаться события батареи. Есть ли способ подтолкнуть это, чтобы заставить его работать или просто запустить некоторый код, чтобы узнать, какой уровень заряда батареи был в последней трансляции?

4b9b3361

Ответ 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... 
}

Я только что получил исключение нулевого указателя, из-за которого приложение вышло из строя!