2016-03-22 5 views
0

В моем приложении я пытался установить сигнал, используя этот код:Android AlarmManager не работает при установке на более длительное время

 Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.YEAR, 2016); 
     calendar.set(Calendar.MONTH, 1); 
     calendar.set(Calendar.DAY_OF_MONTH, 1); 
     calendar.set(Calendar.HOUR_OF_DAY, 15); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.SECOND, 1); 
     calendar.set(Calendar.MILLISECOND, 1); 

     Intent intent = new Intent(G.context, AlarmService.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext, 1010, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     G.alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

Это работает, когда я поставил будильник на 1 минуту или более поздней версии, но не тогда, когда я установите будильник на 30 или 40 минут позже. В то время как я не звоню в течение 30 минут, через 30 минут будильник не работает, и когда экран телефона находится на тревоге, работал ...

Любая помощь была бы оценена.

+0

Привет mosheni, добро пожаловать в StackOverflow, пожалуйста, прочтите [Как создать Minimal, полный и проверяемых пример] (http://stackoverflow.com/ помощь/mcve). – CodingGorilla

ответ

0

Поскольку API 19 set() считается неточным и может задерживаться. Если вам действительно нужен точный сигнал тревоги, вы должны использовать setExact() (доступна с API 19) вместо:

Примечание: Начиная с API 19, время запуска передается этому методу рассматривается как неточное: тревога не будет доставляется до этого времени, , но может быть отложено и доставлено через некоторое время. ОС будет использовать эту политику для того, чтобы «пакетные» сигналы тревоги находились вместе по всей системе , сводя к минимуму количество раз, когда устройство должно «просыпаться» и минимизировать использование батареи. В общем случае тревоги, запланированные в ближайшем будущем , не будут отложены до тех пор, пока аварийные сигналы, запланированные далеко в будущем .

Это изменение произойдет на 19+ устройстве (очевидно), но и только тогда, когда цель API АПК является 19+, так что вы можете

  • изменение целевого API до 18
  • или использования , чтобы узнать, какой метод использовать.

цен добавляются при использовании *_WAKE_UP тревоги, менеджер сигнализации ГАРАНТИИ, что устройство будет бодрствовать достаточно долго, чтобы выполнить метод приемника, но не служба может запустить:

Менеджер сигнализации держит блокировка процессора, пока выполняется сигнал приемника onReceive(). Это гарантирует, что телефон не будет спать, пока вы не закончите работу с трансляцией. Когда функция onReceive() возвращается, диспетчер аварийных сигналов отпускает эту блокировку. Это означает, что телефон в некоторых случаях будет спать, как только ваш метод onReceive() будет завершен. Если ваш тревожный приемник вызвал Context.startService(), возможно, телефон будет спать до того, как будет запущена запрошенная услуга.

Библиотека поддержки v4 предоставляет полезный вспомогательный класс для обработки этого случая: WakefulBroadcastReceiver

В вас так, как вы используете услугу отложенного намерение, я не уверен, что будить применить Гарантии.

+0

my min API - 11 .. Что делать? –

+0

Я бы сначала изменил API * target *, чтобы узнать, отличается ли поведение. – bwt

+0

По уровню API 26.0.0 WakefulBroadcastReceiver лишен. –

1

Хорошо, потому что через долгое время (скажем, более 5 минут) ваше приложение приостановлено, а затем телефон «заснул» с заблокированным экраном. Когда вы разблокируете его, вы получите свой будильник, потому что он поставлен в очередь. Чтобы решить эту проблему, вам необходимо внедрить Wake Lock и добавить его в файл манифеста. В соответствии с Документацией Google «Блокировка от пробуждения - это механизм, указывающий, что ваше приложение должно содержать устройство». Это линия, вы должны добавить в манифесте:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

Вы должны реализовать этот объект в методе OnReceive() в вашем BroadcastReceiver. Вы можете следовать этому руководству, которое использует все, что вам нужно. https://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html

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

Надеюсь, это поможет!

0

я пользоваться услугой

public class AlarmService extends Service { 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onStart(Intent intent, int startid) { 
    //This is my Code and set Alarm 
    stopSelf(); 
} 

}