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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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