Отключить обновление на процент батареи - PullRequest
2 голосов
/ 18 марта 2012

У меня есть служба, которая выполняет фоновые обновления.

Я хочу дать пользователю возможность отключить обновления, когда их процент заряда батареи достигает определенного уровня.

Из моего исследования я собираюсь использовать приемник в методе onCreate моего класса обслуживания, например:

 public class MainService extends Service  
 {  
     @Override
     public void onCreate()
     {      
        this.registerReceiver(this.BatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
     }

    private BroadcastReceiver BatInfoReceiver = new BroadcastReceiver(){  
         @Override  
         public void onReceive(Context arg0, Intent intent) {  
           int level = intent.getIntExtra("level", 0);  
    }  
  };
 }

Я предполагаю, что лучше всего оставить сервис включенным, проверить уровень заряда батареи в сервисе и не выполнять код, интенсивно использующий процессор, исходя из процента?

На самом деле мне не нужно останавливать саму службу и запускать ее снова, исходя из процента заряда батареи?

UPDATE:

Это кажется лучшим решением, но не на 100% уверен. Я зарегистрировал BroadcastReceiver в AndroidManifest:

<receiver android:name="BatteryReceiver" /> 

Затем создал BroadcastReceiver:

 public class BatteryReceiver extends BroadcastReceiver 
 {  
     @Override
     public void onReceive(final Context context, final Intent intent) 
     {      
         final int currentBatteryPercent = intent.getIntExtra("level", 0);
        final int disableBatteryPercent = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(context).getString("batteryPercent", 0);

        //AlarmReceiver is the service that performs the background updates
         final ComponentName component = new ComponentName(context, AlarmReceiver.class);

         if (currentBatteryPercent < disableBatteryPercent)
         {
             context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP);
         }
         else
         {
             context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP);
         }
      }
 }

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

Это верно. Что вы обычно делаете, это назначаете широковещательные намерения для обновления (возможно, через AlarmManager). Когда вы получите уведомление о низком заряде батареи, вы сохраните это в своем сервисе, а затем перед обновлением убедитесь, что батарея не разряжена. здесь - хороший урок по наблюдению за уровнем заряда батареи. Вы не должны делать много при обработке этого намерения, просто поместите уровень заряда батареи где-нибудь и (перед выполнением обновления) убедитесь, что он надлежащим образом «полон».

Ваше обновление - это действительно плохой способ остановить приложение. В общем, попросить менеджера пакетов остановить ваш компонент - это скорее взлом, чем решение. Вместо этого вы должны переместить некоторый код в компонент, который фактически выполняет обновление, и сохранить / обновить информацию для информации об аккумуляторе. Перед обновлением вы проверяете уровень заряда батареи и не продолжаете работу, если вы не чувствуете себя комфортно при обновлении приложения. Использование широковещательного приемника - это нормально, но вам нужно где-то хранить уровень (возможно, sharedprefs). Вместо этого, поэтому лучше всего поместить получателя в службу, где вы выполняете обновление.

1 голос
/ 18 марта 2012

Возможно ли управлять этим требованием с вещательным приемником вместо непрерывного запуска службы?

public void onReceive(final Context context, final Intent intent) {

            if(intent != null && intent.getAction() != null) {
                    String action = intent.getAction();

                    if(action.equals(Intent.ACTION_BOOT_COMPLETED)) {
                            // Set alarm
                    }
                    else if(action.equals(Intent.ACTION_BATTERY_LOW)) {
                            setLocationAlarmReceiverEnabled(context, false);
                    }
                    else if(action.equals(Intent.ACTION_BATTERY_OKAY)) {
                            setLocationAlarmReceiverEnabled(context, true);
                    }
            }
    }
...