setExactAndAllowWhileIdle несоответствие - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть приложение, которое предупреждает пользователей о спутниковых пропусках.Мне стало известно, что спутниковые уведомления не работают должным образом на 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 сделал это так сложно?

...