7

Stworzyłem aplikację, która zawsze działała do wersji Androida 6.0. Myślę, że to funkcja Drzemki, która nie pozwala, by mój alarm wystrzelił.Problem z Menedżerem alarmów w systemie Android 6.0 Tryb drzemki

używam sharedpreferences obsłużyć opcje:

//ENABLE NIGHT MODE TIMER 
    int sHour = blockerTimerPreferences.getInt("sHour", 00); 
    int sMinute = blockerTimerPreferences.getInt("sMinute", 00); 

    Calendar sTime = Calendar.getInstance(); 
    sTime.set(Calendar.HOUR_OF_DAY, sHour); 
    sTime.set(Calendar.MINUTE, sMinute); 

    Intent enableTimer = new Intent(context, CallReceiver.class); 
    enableTimer.putExtra("activate", true); 
    PendingIntent startingTimer = PendingIntent.getBroadcast(context, 11002233, enableTimer, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager sAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    sAlarm.setRepeating(AlarmManager.RTC_WAKEUP, 
      sTime.getTimeInMillis(), 
      AlarmManager.INTERVAL_DAY, startingTimer); 

Wszelkie clue co niewłaściwy tutaj?

Jest to aplikacja do blokowania połączeń. Dziękuję Ci!

EDIT: mam 3 pliki (więcej, ale ...), takich jak:

MainActivity (All code) 
CallReceiver (Broadcast that triggers the alarm again (reboot etc)) 
CallReceiverService (Handles the call/phone state) 
+1

Wykorzystanie 'ADB shell dumpsys alarm' aby potwierdzić, że alarm jest planowy. Zauważ, że 'setRepeating()' jest niedokładne w systemie Android 4.4+. "To też powoduje wyczerpywanie się baterii" - wydaje się to mało prawdopodobne. Kod, który nie działa, nie powinien zużywać baterii. – CommonsWare

+0

Hi @CommonsWare, 52 przebudzenia i 52 alarmy ... Zawsze alarmuje. 'setRepeating()' uruchomi się w tej chwili, bez problemu. – FilipeOS

+0

@FilipeOS Czy sprawiłeś, że to zadziałało? Czy możemy wdrożyć alarmManager.setRepeating() w trybie drzemki? – devgeek

Odpowiedz

13

Tryb Drzemki opóźni alarm do następnego okna konserwacji. Aby uniknąć alarmu Doze mode, możesz użyć setAndAllowWhileIdle(), lub setAlarmClock(). Będziesz miał około 10s, aby wykonać swój kod i ustaw swój kolejny alarm (nie częściej niż raz na 15 minut do metod z _AndAllowWhileIdle chociaż)

Jeśli chcesz przetestować tryb Doze, można użyć ADB command:

  1. Skonfiguruj urządzenie sprzętowe lub urządzenie wirtualne z systemem Android 6.0 (poziom API 23) lub nowszym obrazem systemu.

  2. Podłącz urządzenie do komputera programistycznego i zainstaluj aplikację.

  3. Uruchom aplikację i pozostaw ją aktywną.
  4. Wyłącz ekran urządzenia. (Aplikacja pozostaje aktywny.) zmusić system do cyklu przez tryby drzemać, uruchamiając następujące polecenia:

    adb shell dumpsys battery unplug

    adb shell dumpsys deviceidle step

  5. Być może trzeba uruchomić drugi komenda więcej niż raz. Powtarzaj tę czynność, dopóki stan urządzenia nie zmieni się na bezczynny.

  6. Obserwuj zachowanie aplikacji po ponownym uruchomieniu urządzenia. Upewnij się, że aplikacja odzyskuje wdzięk po wyłączeniu Drzemki.

Edit: Dodaj setAlarmClock przykład

Nie zapomnij sprawdzić poziom SDK (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
Intent intent = new Intent(this, MyAlarmReceiver.class); //or just new Intent() for implicit intent 
//set action to know this come from the alarm clock 
intent.setAction("from.alarm.clock"); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
//Alarm fire in 5s. 
am.setAlarmClock(new AlarmManager.AlarmClockInfo(System.currentTimeMillis() + 5000, pi), pi); 
+0

Hi @ xiaomi, po prostu zastąp "setRepeating" dla 'setAlarmClock'? Z tymi samymi parametrami? Czy możesz zrobić przykład? Dziękuję Ci! – FilipeOS

+0

Edytuję odpowiedź, ale nie jest to bardzo różna od innych metod alarmowych. – xiaomi

+0

To tylko przykład uruchomienia alarmu po 5 sekundach. Wybierz czas, który chcesz. – xiaomi

1

Jeśli urządzenie znajduje się w trybie drzemki, trzeba użyć jednej z tych API: setExactAndAllowWhileIdle lub setAndAllowWhileIdle.

Należy pamiętać, że nie ma interfejsu API do wybudzania urządzenia w trybie drzemki dla powtarzającego się alarmu, więc jeśli potrzebujesz powtarzającego się alarmu, aby obudzić urządzenie podczas drzemki, musisz użyć powyższych interfejsów API i ponownie uzbroić timer przy każdym wystrzeleniu timera.