6

Я разрабатываю приложение, которое использует 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 этот код всегда работал очень хорошо.

Я много исследовал об этом, но, к сожалению, я не получил полезной информации. Дело не в том, что они получают тревогу с задержкой (как я читал в некоторых потоках), это то, что они вообще не получают ее. Таким образом, речь идет не о известной проблеме у леденца и будильника.

Я ценю ваше время, и любое предложение приветствуется!

+0

«Это код, который я использую» - я бы изменил ваш 'if', чтобы проверить' Build.VERSION_CODES.M'. «Я использую широковещательный приемник» - ваш «WakeLock» не нужен, поскольку 'onReceive()' вызывается в системном «WakeLock» при срабатывании 'AlarmManager'. Однако, если «делать некоторые вещи» всего пару миллисекунд, вы должны переместить эту логику в «IntentService» и использовать «WakefulBroadcastReceiver». Помимо этого, у Samsung (например, у SONY и других) есть собственный режим Doze в режиме настройки до 6.0, поэтому «AlarmManager» ненадежен, если вы не добавите его в какой-либо белый список устройств. – CommonsWare

ответ

9

Ваша проблема (или кошмар) - это Samsung Smart Manager. Это приложение поставляется с предустановленными всеми телефонами Samsung с 2015 года и должно деактивировать неиспользуемые приложения. «Откуда он знает, какие приложения не используются?» Вы можете спросить - просто:

Все приложения, которые не были запущены пользователем в течение 3 дней, деактивируются.

Все остальные записи AlarmManager - конечно же - также удаляются. Вы можете прочитать об этом на своих «форумах разработчиков». Не стесняйтесь следовать here или here, пока эти темы не будут удалены сотрудниками. Мне еще нужно, чтобы кто-то из Samsung ответил на эту тему.

Единственный способ «исправить» это сообщить пользователям вашего приложения о ситуации и показать им, как настроить белый список приложения в Smart Manager. Нам нужно было настроить веб-сайт с пошаговыми инструкциями, показывающими, как это сделать для наших пользователей.

Вы можете подумать о настройке фоновой службы или вызове AlarmManager каждые шесть часов или около того - ни один из этих хаков не будет работать.

+2

Спасибо, что поделились своим делом со мной! Ты спас свой день. Это очень раздражает, что Samsung делает такую ​​вещь и не несет никакой ответственности за это. SMH. –

+2

ОБНОВЛЕНИЕ: Если ваше имя пакета содержит «предупреждение» или «будильник», Smart Manager не отключит приложение. Подробнее здесь: http: // stackoverflow.com/a/34085645/128092 – saibotd

+0

Знаете ли вы, помогает ли в этом случае использование JobScheduler вместо AlarmManager? – jakk

Смежные вопросы