Android: Как повторять услугу с AlarmManager каждые 15 минут, но только с 8:00 до 18:00? - PullRequest
16 голосов
/ 16 мая 2011

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

Что мне делать?

Ответы [ 2 ]

29 голосов
/ 16 мая 2011

Если служба обращается к облаку с HTTP-запросами get / post / what, то обратите внимание, что решение C2DM обеспечит лучшее время автономной работы, а решение SyncAdapter может предоставить несколько преимуществ. (Рекомендую посмотреть видео по Google I / O по обеим темам.)

Следующий код делает нечто похожее на то, о чем вы изначально спрашивали.

public class MyUpdateService extends IntentService
{
  public MyUpdateService()
  {
    super(MyUpdateService.class.getSimpleName());
  }

  @Override
  protected void onHandleIntent(Intent intent)
  {
    // Do useful things.

    // After doing useful things...
    scheduleNextUpdate();
  }

  private void scheduleNextUpdate()
  {
    Intent intent = new Intent(this, this.getClass());
    PendingIntent pendingIntent =
        PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    // The update frequency should often be user configurable.  This is not.

    long currentTimeMillis = System.currentTimeMillis();
    long nextUpdateTimeMillis = currentTimeMillis + 15 * DateUtils.MINUTE_IN_MILLIS;
    Time nextUpdateTime = new Time();
    nextUpdateTime.set(nextUpdateTimeMillis);

    if (nextUpdateTime.hour < 8 || nextUpdateTime.hour >= 18)
    {
      nextUpdateTime.hour = 8;
      nextUpdateTime.minute = 0;
      nextUpdateTime.second = 0;
      nextUpdateTimeMillis = nextUpdateTime.toMillis(false) + DateUtils.DAY_IN_MILLIS;
    }
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC, nextUpdateTimeMillis, pendingIntent);
  }
}
0 голосов
/ 17 сентября 2017

Следуйте этим простым шагам, чтобы сохранить работоспособность навсегда в устройстве Android. 1. Звоните в службу с помощью диспетчера тревог каждые 15 минут. 2. вернуть START_STICKY в методе onStart. 3. При уничтожении вызовите диспетчер аварийных сигналов и перезапустите службу, используя метод startService. 4. (Необязательно) Повторите пункт 3 в методе onTaskRemoved.

...