Oreo: startService () не генерирует исключение IllegalStateException при вызове в фоновом режиме

Согласно ограничения фонового исполнения, введенному в Android Oreo, вызов startService, когда приложение находится в фоновом режиме, должен вызывать IllegalArgumentException. Отметьте этот вопрос: Android 8.0: java.lang.IllegalStateException: не разрешено запускать намерение службы.

Я создал пример приложения для Android Oreo, которое выполняет следующие функции:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            startService(new Intent(MainActivity.this, MyService.class));
        }
    }, 5000);
}

Затем я запускаю приложение и после нажатия кнопки «Домой» сразу переводю приложение в фоновое состояние. Но исключение не создается. Как это может быть? Я ожидаю, что в этом случае приложение выйдет из строя.

Вы запускаете приложение на устройстве Oreo?

TheWanderer 13.09.2018 17:21

@TheWanderer Я запускаю приложение на Pixel 2 с установленным Android 9 (Pie).

makovkastar 13.09.2018 17:29

Я думаю, что есть таймаут (может быть, 15 секунд). Попробуйте установить эту задержку на 20000.

egoldx 13.09.2018 17:31

Хорошо, так должно быть. Можете ли вы указать, где в документах говорится, что это исключение должно выдаваться?

TheWanderer 13.09.2018 17:31

@egoldx, это другой тайм-аут. Очевидно, это исключение должно выдаваться при вызове startService().

TheWanderer 13.09.2018 17:31

@TheWanderer developer.android.com/about/versions/oreo/android-8.0-change‌ s, проверьте раздел Ограничения фонового выполнения: метод startService () теперь выдает исключение IllegalStateException, если приложение, ориентированное на Android 8.0, пытается использовать этот метод в ситуации, когда ему не разрешено создавать фоновые службы.

makovkastar 13.09.2018 17:33

Да, но система по-прежнему считает это приложение передовым.

egoldx 13.09.2018 17:33

@egoldx о, правда. Может быть, поэтому.

TheWanderer 13.09.2018 17:34

@makovkastar Вы уверены, что ваше приложение работает в фоновом режиме при запуске startService?

egoldx 13.09.2018 17:35

@egoldx Я установил тайм-аут сначала на 20, затем на 30, но все равно не вылетает. Да, я нажимаю кнопку «Домой» сразу после запуска приложения и жду 30 секунд.

makovkastar 13.09.2018 17:36

Нашел кое-что интересное. Позвольте мне написать ответ.

TheWanderer 13.09.2018 17:38

На самом деле, неважно, мне нужно продолжать поиски.

TheWanderer 13.09.2018 17:42

Я озадачен, читая вопрос и комментарии. Я также столкнулся с падением на Oreo. Я не обновился до пирога.

exploitr 13.09.2018 17:54

К сожалению, мне не хватает ответа, но у меня есть ссылки, по которым люди могут отслеживать: github.com/aosp-mirror/platform_frameworks_base/blob/master/‌…, raw.githubusercontent.com/aosp-mirror/platform_frameworks_ba‌ se /…, raw.githubusercontent.com/aosp-mirror/platform_frameworks_ba‌ se /…. Может помочь разница между master и oreo-release.

TheWanderer 13.09.2018 18:02

ваше приложение нацелено на 26 или <SDK?

DarShan 13.09.2018 19:38

@DarShan targetSdkVersion 27

makovkastar 14.09.2018 09:38
4
16
769
1

Ответы 1

Согласно документации Google на ограничения фоновой службы:

While an app is in the foreground, it can create and run both foreground and background services freely. When an app goes into the background, it has a window of several minutes in which it is still allowed to create and use services.

Обычно я обнаружил, что окно занимает около минуты, но для других это определенно может быть другим.

Взгляните на общие журналы устройства (запустите adb logcat из командной строки или отключите фильтры в окне Android Studio Logcat) после того, как вы загрузили приложение в фоновый режим, и найдите что-то вроде:

09-26 13:25:37.150 4741 4756 W ActivityManager: Stopping service due to app idle: u0a267 -1m12s700ms com.example/.MyService

Любой запрос на запуск службы после этого должен вызывать исключение. Я предполагаю, что вам нужно увеличить тайм-аут до минуты или двух.

Другие вопросы по теме