У меня есть приложение, которое предупреждает пользователей о спутниковых пропусках.Мне стало известно, что спутниковые уведомления не работают должным образом на Android 8 (в частности, 8.1.0).
Чтобы разбудить мое приложение и показать уведомление, я использую AlarmManager.
PendingIntent pendingIntent = PendingIntent.getService(myActivity, requestCode++, intent, 0 );
int delay = 70; // Seconds
Calendar cal = Calendar.getInstance();
// Print out the milliseconds before and after
// adding the delay just to make sure it is correct.
Log.i( "NotificationMgr", String.format( "%d", cal.getTimeInMillis() ) );
cal.add( Calendar.SECOND, delay ); // For testing
Log.i( "NotificationMgr", String.format( "%d", cal.getTimeInMillis() ) );
// Register the pending intent with the AlarmManager
AlarmManager alarmMgr = (AlarmManager) getSystemService( Activity.ALARM_SERVICE );
if ( android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M )
{
alarmMgr.setExactAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent );
}
Во время тестирования я вижу, что будильник не срабатывает, если установить задержку более 60 секунд, будильник не срабатывает.Все под 60 секунд в порядке.Этот код прекрасно работает на моем устройстве Android 6.
Кто-нибудь знает, почему это не будет работать на Android 8?
[Позже]
ОК,троллинг через Logcat Я вижу это сообщение, когда должен сработать будильник:
2018-12-28 13: 31: 36.301 772-2222 /?W / ActivityManager: Фоновый запуск не разрешен: service Intent {flg = 0x4 cmp = com.simulationcurriculum.skysafari6plus / com.simulationcurriculum.skysafari.pid = -1 uid = 10150 pkg = com.simulationcurriculum.skysafari6plus
Есть идеи, что это значит?
[Даже позже ...]
Поиск этого предупреждающего сообщениявзял меня к кому-то, кто обнаружил, что ему нужно использовать getForegroundService (), а не getService ().Я сейчас делаю это для Oreo и выше.Кажется, это работает для меня, но мне нужно будет провести дополнительное тестирование.
Если честно, мне не ясно различие в двух вызовах.Каковы последствия этого изменения?Если кто-то просветит меня, я буду признателен.
[Подробнее]
Использование getForgroundService в основном работает, но не работает, когда устройство находится в режиме Doze.Я видел некоторые ссылки на использование JobScheduler, но в этом посте он ссылается на тот факт, что это все еще может не работать в режиме Doze:
Служба не запускается на Oreo в виджете приложения с использованием PendingIntent
Почему Google сделал это так сложно?