Я разрабатываю приложение, которое использует AlarmManager для установки будильников (обычно около 50), которые необходимо уволить в определенное время в течение года. Это код, который я использую с тех пор, как 4.4 kitkat изменил AlarmManager.AlarmManager не работает на устройствах Samsung в 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);
}
Помимо приведенного выше кода, я использую широковещательный приемник, правильно определенный в манифесте.
public class LocalReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
PushWakeLocker.acquire(context);
// do some stuff
PushWakeLocker.release();
}
}
Дополнительная информация thay может помочь.
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="19" />
С несколько месяцев назад я получал плохие отзывы только от устройств Samsung (5,0 /5.1 Android версии), которые не получают свои локальные уведомления на всех. Я имею в виду, что это не срабатывает при тревоге, кажется, что устройство пропускает его или не просыпается.
В тестах, в основном с Samsung S4 с 5.0.1, я всегда получаю сигналы тревоги вовремя, так что это сводит меня с ума. FYI этот код всегда работал очень хорошо.
Я много исследовал об этом, но, к сожалению, я не получил полезной информации. Дело не в том, что они получают тревогу с задержкой (как я читал в некоторых потоках), это то, что они вообще не получают ее. Таким образом, речь идет не о известной проблеме у леденца и будильника.
Я ценю ваше время, и любое предложение приветствуется!
«Это код, который я использую» - я бы изменил ваш 'if', чтобы проверить' Build.VERSION_CODES.M'. «Я использую широковещательный приемник» - ваш «WakeLock» не нужен, поскольку 'onReceive()' вызывается в системном «WakeLock» при срабатывании 'AlarmManager'. Однако, если «делать некоторые вещи» всего пару миллисекунд, вы должны переместить эту логику в «IntentService» и использовать «WakefulBroadcastReceiver». Помимо этого, у Samsung (например, у SONY и других) есть собственный режим Doze в режиме настройки до 6.0, поэтому «AlarmManager» ненадежен, если вы не добавите его в какой-либо белый список устройств. – CommonsWare