setRepeating of AlarmManager не отвечает в течение указанного времени

AlarmManager следует повторять каждую 1 минуту, но повторять каждые 1, 2, 3 или 4 минуты.

Так как приложение я бросаю AlarmManager

public class PacienteApp extends Application {
@Override
public void onCreate() {
    AlarmManager gps = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(this, GpsReceiver.class);
    PendingIntent pending = PendingIntent.getBroadcast(this, 0, i, 0);
    gps.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000 * 60, pending);
}
}

Поскольку BroadcastReceiver вызывает IntentService.

public class GpsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Intent gps = new Intent(context, GpsIntentService.class);
    context.startService(gps);
}
}

И служба намерений выполняет задачу

public class GpsIntentService extends IntentService {

public GpsIntentService() {
    super("GpsIntentService");
}

@Override
protected void onHandleIntent(Intent intent) {
    System.out.println("Intent service ejecutado");
}
}

Поскольку это происходит в фоновом режиме, у меня есть пара действий, выполняемых на переднем плане.


person manduinca    schedule 09.03.2016    source источник
comment
Как вы это измеряете - в широковещательном приемнике или в службе намерений? Если в службе намерений, если что-то заставляет службу работать долго, это предотвратит запуск следующей.   -  person Gabe Sechan    schedule 09.03.2016
comment
Замеряю время печати в логкэте, печать отправляется из интентсервиса.   -  person manduinca    schedule 09.03.2016
comment
Вместо этого измеряйте от приемника, давайте просто попробуем устранить потенциальный источник проблем. Если получатель звонит каждую минуту, проблема в вашем сервисе. Если нет, то дело в сигнализации.   -  person Gabe Sechan    schedule 09.03.2016
comment
Также помните, что Примечание: начиная с API 19, все повторяющиеся сигналы тревоги являются неточными. Если вашему приложению требуется точное время доставки, оно должно использовать одноразовые точные сигналы тревоги, каждый раз перепланируя их, как описано выше. Устаревшие приложения, чья targetSdkVersion более ранняя, чем API 19, по-прежнему будут обрабатывать все свои сигналы тревоги, включая повторяющиеся сигналы тревоги, как точные.   -  person Gabe Sechan    schedule 09.03.2016


Ответы (1)


Начиная с KitKat (API 19), будильники точны и объединены в пакеты, чтобы продлить срок службы батареи за счет сведения к минимуму количества раз, которое устройство должно просыпаться.

Из документации по AlarmManager для setRepeating():

Примечание: начиная с API 19 все повторяющиеся сигналы тревоги являются неточными. Если вашему приложению требуется точное время доставки, оно должно использовать одноразовые точные сигналы тревоги, каждый раз перепланируя их, как описано выше. Устаревшие приложения, у которых targetSdkVersion предшествует API 19, по-прежнему будут обрабатывать все свои сигналы тревоги, включая повторяющиеся сигналы тревоги, как точные.

Для большей точности вам нужно будет использовать setExact() и переназначать будильник каждый раз, когда будильник будит ваше приложение. Однако делайте это очень осторожно, так как установка частых будильников (например, каждую минуту) значительно сократит срок службы батареи ваших пользователей.

Из документации setExact():

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

person Bryan Herbst    schedule 09.03.2016