Tworzę aplikację, która używa AlarmManagera do ustawiania alarmów wiązki (zwykle około 50), które muszą być wystrzeliwane w określonym czasie w ciągu roku. To jest kod, którego używam, ponieważ 4.4 kitkat zmienił program AlarmManager.AlarmManager nie działa na urządzeniach Samsung w Lollipop
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
long setDate = fireDate.getTime(); // it's a calendar date defined above
Intent intent = new Intent(LOCAL_DISPLAY_MESSAGE_ACTION);
PendingIntent pending = PendingIntent.getBroadcast(ctx,
id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.RELEASE.startsWith("6")) {
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, setDate, pending);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
am.setExact(AlarmManager.RTC_WAKEUP, setDate, pending);
} else {
am.set(AlarmManager.RTC_WAKEUP, setDate, pending);
}
Oprócz powyższego kodu używam odbiornika telewizyjnego prawidłowo zdefiniowanego w manifeście.
public class LocalReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
PushWakeLocker.acquire(context);
// do some stuff
PushWakeLocker.release();
}
}
Więcej informacji może pomóc.
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="19" />
Ponieważ kilka miesięcy temu byłem coraz złe opinie tylko z urządzeniami firmy Samsung (5.0 /5.1 wersja Androida), które nie dostają ich lokalnych powiadomień w ogóle. Mam na myśli, że nie uruchamia alarmu, wydaje się, że urządzenie go pomija lub się nie budzi.
W testach, głównie z Samsung S4 z 5.0.1, zawsze otrzymuję alarmy na czas, więc to doprowadza mnie do szału. FYI ten kod zawsze działał całkiem dobrze.
Dużo się o tym dowiedziałem, ale niestety nie otrzymałem żadnych pomocnych informacji. Nie chodzi o to, że otrzymają alarm z opóźnieniem (jak czytałem w niektórych wątkach), to, że w ogóle go nie dostają. Więc nie chodzi o znany problem w Lollipop i alarmmanager.
Doceniam Twój czas i wszelkie sugestie są mile widziane!
"To jest kod, którego używam" - chciałbym zmienić twoje 'if', aby sprawdzić' Build.VERSION_CODES.M'. "Używam odbiornika" - twoje 'WakeLock' jest niepotrzebne, ponieważ' onReceive() 'jest wywoływane w dostarczonym przez system' WakeLock' po wywołaniu przez 'AlarmManager'. Jednakże, chyba że "zrób coś" jest tylko kilka milisekund, powinieneś przenieść tę logikę do 'IntentService' i użyć' WakefulBroadcastReceiver'. Poza tym, Samsung (podobnie jak SONY i inne) ma swój własny tryb Doze, tryb konfiguracji sprzed 6.0, więc 'AlarmManager' jest zawodny, chyba że zostaniesz dodany do jakiejś białej listy urządzeń. – CommonsWare