Согласно ограничения фонового исполнения, введенному в 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);
}
Затем я запускаю приложение и после нажатия кнопки «Домой» сразу переводю приложение в фоновое состояние. Но исключение не создается. Как это может быть? Я ожидаю, что в этом случае приложение выйдет из строя.
@TheWanderer Я запускаю приложение на Pixel 2 с установленным Android 9 (Pie).
Я думаю, что есть таймаут (может быть, 15 секунд). Попробуйте установить эту задержку на 20000.
Хорошо, так должно быть. Можете ли вы указать, где в документах говорится, что это исключение должно выдаваться?
@egoldx, это другой тайм-аут. Очевидно, это исключение должно выдаваться при вызове startService()
.
@TheWanderer developer.android.com/about/versions/oreo/android-8.0-change s, проверьте раздел Ограничения фонового выполнения: метод startService () теперь выдает исключение IllegalStateException, если приложение, ориентированное на Android 8.0, пытается использовать этот метод в ситуации, когда ему не разрешено создавать фоновые службы.
Да, но система по-прежнему считает это приложение передовым.
@egoldx о, правда. Может быть, поэтому.
@makovkastar Вы уверены, что ваше приложение работает в фоновом режиме при запуске startService
?
@egoldx Я установил тайм-аут сначала на 20, затем на 30, но все равно не вылетает. Да, я нажимаю кнопку «Домой» сразу после запуска приложения и жду 30 секунд.
Нашел кое-что интересное. Позвольте мне написать ответ.
На самом деле, неважно, мне нужно продолжать поиски.
Я озадачен, читая вопрос и комментарии. Я также столкнулся с падением на Oreo. Я не обновился до пирога.
К сожалению, мне не хватает ответа, но у меня есть ссылки, по которым люди могут отслеживать: 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
.
ваше приложение нацелено на 26 или <SDK?
@DarShan targetSdkVersion 27
Согласно документации 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
Любой запрос на запуск службы после этого должен вызывать исключение. Я предполагаю, что вам нужно увеличить тайм-аут до минуты или двух.
Вы запускаете приложение на устройстве Oreo?