6

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!

+0

"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

Odpowiedz

9

Twój problem (lub koszmar) to Samsung Smart Manager. Ta aplikacja jest fabrycznie instalowana ze wszystkimi telefonami Samsung od 2015 roku i ma na celu dezaktywację aplikacji, które są nieużywane. "Skąd wiadomo, które aplikacje nie są używane?" Możesz zapytać - proste:

Każda aplikacja, która nie została uruchomiona przez użytkownika przez 3 dni, zostanie dezaktywowana.

Wszystkie pozostałe wpisy AlarmManager - oczywiście - również zostaną usunięte. Możesz przeczytać o tym na swoich "Forum dla programistów". Zachęcamy do obserwowania here lub here do czasu usunięcia tych wątków przez personel. Nie widziałem jeszcze, aby ktoś z Samsunga odpowiedział na ten temat.

Jedynym sposobem na "naprawienie" tego jest poinformowanie użytkowników aplikacji o sytuacji i pokazanie im, jak dodać aplikację do białej listy w aplikacji Smart Manager. Musieliśmy skonfigurować witrynę internetową z instrukcjami krok po kroku pokazującymi, jak to zrobić dla naszych użytkowników.

Możesz pomyśleć o skonfigurowaniu usługi w tle lub wywołaniu programu AlarmManager co sześć godzin - żaden z tych hacków nie zadziała.

+2

Dzięki za podzielenie się ze mną swoim odkryciem! Uratowałeś mi dzień. To naprawdę denerwujące, że Samsung robi coś takiego i nie bierze na siebie żadnej odpowiedzialności. smh. –

+2

AKTUALIZACJA: Jeśli nazwa twojego pakietu zawiera "alert" lub "alarm", Smart Manager nie dezaktywuje aplikacji. Więcej tutaj: http: // stackoverflow.com/a/34085645/128092 – saibotd

+0

Czy wiesz, czy w tym przypadku pomaga funkcja JobScheduler zamiast AlarmManager? – jakk

Powiązane problemy