0

Я хочу контролировать уровень заряда батареи, и если он достигнет определенного уровня, я хочу ДЕЛАТЬ-ЧТО-ТО. Я беспокоюсь о том, что излишне избыточно изливается аккумулятор.Правильный оптимизированный способ мониторинга уровня заряда батареи в android

Использование службы будет продолжать работать в фоновом режиме. Также, если я использовал намерение android.intent.action.BATTERY_CHANGED, он будет проверять каждое изменение уровня заряда батареи. Эти два метода могут слить ненужную батарею в соответствии с моими требованиями.

Итак, если я использую AlarmManager (который также является сервисом, обрабатываемым ОС), он будет проверять уровень заряда батареи на каждом пользовательском (соответствующее время).

Следующие коды, которые я внедрил.

import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

private AlarmManager mAlarmManager; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_main); 

     mAlarmManager= (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     Intent intentAlarm = new Intent(this, AlarmReceiverTest.class); 

     // User defined time 
     long fiveMin= (AlarmManager.INTERVAL_FIFTEEN_MINUTES/3); // adjustment here 

     mAlarmManager.setRepeating(AlarmManager.RTC, 
        System.currentTimeMillis()+fiveMin, oneMin, 
        PendingIntent.getBroadcast(this,1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT)); 

    } 

} 

вещательный приемник:

public class AlarmReceiverTest extends BroadcastReceiver { 

@Override 
public void onReceive(Context pContext, Intent arg1) { 

    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    Intent batteryStatus = pContext.registerReceiver(null, ifilter); 

    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, 100); 
    int percent = (level*100)/scale; 

    if(percent== myThreshold) 
     //DO-SOMETHING 
} 

}

В манифеста:

<receiver android:name="AlarmReceiverTest"> 
    <intent-filter> 
     <action android:name="android.intent.action.BATTERY_CHANGED"/> 
    </intent-filter> 
</receiver> 

Разрешение:

android.permission.BATTERY_STATS 

С его повторяющимся сигналом тревоги он будет продолжать проверять, даже если приложение закрыто.

например .: DO-SOMETHING: может быть заблокировано приложение, если приложение уже было открыто. ИЛИ не разрешено открывать приложение, если оно уже было закрыто.

Является ли это правильным способом, и это мое понимание правильно? Пожалуйста, предложите мне, если есть какой-либо другой правильный способ.

Редакцией:

Если бы я, чтобы проверить уровень заряда батареи на каждые 5-10 часов интервала, что было бы лучшим способом сделать это?

+0

Почему люди downvote это? Ответ @Sats отлично поработал для того, что мне нужно для этого. – hellaandrew

ответ

5

Вам не нужно использовать класс AlarmManager. Ваше приложение потребляет больше батареи, если вы используете класс AlarmManager.

Самый простой способ сделать это - использовать прослушиватель вещания для намерения ACTION_BATTERY_CHANGED.

public class AlarmReceiverTest extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      int batteryLevel = intent.getIntExtra(
        BatteryManager.EXTRA_LEVEL, 0); 
      int maxLevel = intent 
        .getIntExtra(BatteryManager.EXTRA_SCALE, 0); 
      int batteryHealth = intent.getIntExtra(
        BatteryManager.EXTRA_HEALTH, 
        BatteryManager.BATTERY_HEALTH_UNKNOWN); 
      float batteryPercentage = ((float) batteryLevel/(float) maxLevel) * 100; 

      // Do something with batteryPercentage and batteryHealth. 
      // batteryPercentage here ranges 0-100 
     } 
    } 

OnReceive работает каждый раз, когда изменения уровня батареи.

В вашей основной деятельности зарегистрировать вещательный приемник:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    AlarmReceiverTest mBatteryLevelReceiver = new AlarmReceiverTest(); 
    registerReceiver(mBatteryLevelReceiver, new IntentFilter(
      Intent.ACTION_BATTERY_CHANGED)); 
} 
+0

Я также согласен с тем, что AlarmManager не нужен - ACTION_BATTERY_CHANGED не вызывается очень часто. Также стоит повторить, что согласно http://developer.android.com/reference/android/content/Intent.html#ACTION_BATTERY_CHANGED этот ресивер должен быть зарегистрирован в коде, а не в манифесте. – Okas

+0

, так что, если я не отменил регистрацию этой трансляции, она будет продолжать работать постоянно при замене батареи даже после закрытия приложения? – OnePunchMan

+0

Да, если вы хотите его остановить, используйте это: @Override public void onDestroy() { super.onDestroy(); unregisterReceiver (mBatteryLevelReceiver); } – Sats

Смежные вопросы