Intereting Posts
Использование учетной записи Google в качестве входа в систему … что дальше? Как установить равный размер шрифта в ячейках таблицы для мобильных устройств html-страниц Проект не был создан из-за «Не удалось удалить» project / bin / classes / com ', " Поддерживаемые устройства 0 в Google Play Какая версия eclipse безопасна для разработки для Android? Контекст хочет FLAG_ACTIVITY_NEW_TASK, но я уже установил этот флаг Как создать / скомпилировать приложение ndk? Проблемы с SD-картой Android Как исправить ошибку «Не удалось открыть порт отладчика» в Android Studio? Произошла ошибка после обновления Android SDK Tool REV 22 «Не удалось разрешить суперкласс L» Активность просочилась IntentReceiver, которая была первоначально зарегистрирована здесь. Вам не хватает приглашения на unregisterReceiver ()? Может ли textview иметь буквы разных цветов? Настройка шрифта spinner Android: просмотр камеры – сбой приложения, когда я не использую устаревший метод Как я должен делать это с уведомлением до начала деятельности без новых намерений

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

Solutions Collecting From Web of "Получите уровень заряда аккумулятора, прежде чем радиовещательный приемник ответит на Intent.ACTION_BATTERY_CHANGED"

Есть ли способ подтолкнуть это, чтобы заставить его работать или просто запустить какой-то код, чтобы узнать, какой уровень заряда батареи был в последней трансляции?

Вы можете вызвать registerReceiver() с вашим IntentFilter и null BroadcastReceiver чтобы получить Intent последнего вещания. Это работает, потому что ACTION_BATTERY_CHANGED – это так называемая «липкая трансляция», которую я описываю в этом вопросе и ответе StackOverflow .

Вот как получить уровень заряда батареи без регистрации приемника:

 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 не разрешено регистрироваться для получения намерений

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

Я использую этот метод, чтобы получить уровень заряда батареи без получения обновлений.

 public float getMyBatteryLevel() { Intent batteryIntent = this.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); return batteryIntent.getIntExtra("level", -1); } 

Имейте в виду, что намерение, которое вы получаете от вызова registerReceiver

 Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

Может быть нулевым. Поэтому, пожалуйста, сделайте чек перед использованием намерения, например

 if(intent != null){ // do your stuff here... } 

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