2012-04-18 19 views
5

Ustawiłem AlarmManagr z powtarzaniem czasu. Oto moja metoda, dzięki której mam ustawienie go:AlarmManager nie działa w trybie uśpienia

public void setAlarmManager(Context context, Intent intent) {   
    PendingIntent pendingIntent; 
    pendingIntent = PendingIntent.getService(context, 0, intent, 0);    
    AlarmManager alarmManager = 
     (AlarmManager)context.getSystemService(context.ALARM_SERVICE); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 10); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
           calendar.getTimeInMillis(), 
           40000, pendingIntent);     
} 

Działa to dobrze, z wyjątkiem, gdy urządzenie przechodzi w tryb uśpienia The alarm przestaje pracy aż ręcznie obudzić moje urządzenie. Po obudzeniu urządzenie AlarmManager zacznie działać ponownie.

Jak utrzymać działanie menedżera nawet w trybie uśpienia?

+0

AlarmManager.set (AlarmManager.RTC_WAKEUP, ...) działa dobrze dla mnie, nie próbowałem AlarmManager.setRepeating(). może to jest powiązane? nie wiem, tylko pomyślałem, że wspomnę o – SteelBytes

+0

setRepeating po prostu powtórz zadanie po pewnym czasie. reszta rzeczy jest taka sama – Reyjohn

+0

Czy ktoś może mi dać rozwiązanie? – Reyjohn

Odpowiedz

6

To dlatego, że Twój telefon PendingIntent dzwoni do usługi, a nie do BroadcastReceiver, co oznacza, że ​​urządzenie może powrócić do trybu uśpienia przed utworzeniem usługi. Jeśli przejdziesz do odbiornika telewizyjnego, "powinien" pozostać w stanie uśpienia, dopóki nie zostanie zakończona funkcja onReceive programu BroadcastReceiver, co oznacza, że ​​będziesz miał czas, aby uzyskać wakelock i rozpocząć korzystanie z usługi. Nawet jeśli przeprowadzisz się do BroadcastReceiver, będziesz chciał zdobyć wakelock, dopóki nie zakończysz przetwarzania, jeśli zajmie to więcej niż 10 sekund (co jest limitem BroadcastReceiver).

To jest wzięte z ustępem 2 android dokumentacji AlarmManager:

”... Jeśli odbiornik alarm nazywa Context.startService(), możliwe jest, że telefon będzie spać przed żądana usługa jest uruchomiona Aby temu zapobiec. Twój BroadcastReceiver i usługa będą musiały wdrożyć osobną zasadę blokowania w celu zagwarantowania, że ​​telefon będzie działał, dopóki usługa nie będzie dostępna. "

Powiązane problemy