Начните обслуживание точно в начале часа и повторяйте каждый час после этого - PullRequest
0 голосов
/ 11 января 2012

Я хочу запустить IntentService в начале каждого часа, повторяя это точно в час (13:00, 14:00, 15:00 и т. Д.).

Посмотрев документациюЯ считаю, что использование AlarmManager для этого является наилучшей практикой.

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

Для тестирования у меня каждые 3 минуты срабатывает будильник в коде ниже

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

@Override
protected void onHandleIntent(Intent intent)
{  
  PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
  PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |       PowerManager.ACQUIRE_CAUSES_WAKEUP, "VibrateTag");
  wakeLock.acquire();

  Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

  v.vibrate(300);

  NextAlarm();
}

private void NextAlarm()
{
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 + 3 * (60 * 1000);
Time nextUpdateTime = new Time();
nextUpdateTime.set(nextUpdateTimeMillis);

if (nextUpdateTime.hour < 6 || 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);
}
@Override
public void onCreate(){
    Toast.makeText(this, "service starting", (10 * 1000)).show();
    super.onCreate();

}

@Override
public void onDestroy() {
  Toast.makeText(this, "service stopping", (10 * 1000)).show();
  super.onDestroy();
} 



}

Ответы [ 3 ]

0 голосов
/ 11 января 2012

Моя проблема в том, что я не могу установить будильник на вершине следующего часа, как бы я поступил об этом?

Рассчитайте, когда вершинаследующий час, затем используйте его в качестве второго параметра для setRepeating() на AlarmManager.

0 голосов
/ 11 января 2012

Вы можете найти миллисекундное время по Гринвичу следующего часа с таким кодом (не проверено)

public static final long utcMillisNextHour() {
    Time t = new Time();
    t.setToNow();
    t.hour++;
    t.minute = 0;
    t.second = 0;
    return t.normalize(true);
}

Затем вы можете использовать один из метода setReapting .. () объекта AlarmManager с типом времени, который принимает время UTC и интервал INTERVAL_HOUR. Если намерение, которое вы отправляете, является фиксированным, не причиняйте вреда при его многократном вызове, поскольку каждый метод setRepeating () удаляет предыдущие.

0 голосов
/ 11 января 2012

Если вы пробовали RTC_WAKEUP, флаг RTC вызовет тревогу только после выхода устройства из спящего режима.

...