Устранение неполадок служб переднего плана

На этой странице обсуждаются некоторые распространенные причины сбоев в работе приоритетных служб, а также помощь в определении причины проблемы.

В этом документе обсуждаются следующие вопросы:

Прежде чем приступить к устранению неполадок

Проверьте последние изменения в приоритетных службах

Если службы переднего плана используются неправильно, они могут иметь негативные последствия для производительности устройства и срока службы батареи. По этой причине выпуски платформы Android часто вносят изменения в поведение служб переднего плана, чтобы ограничить эти плохие последствия.

Если у вас возникли проблемы с передовыми службами, вам следует проверить изменения в документации передовых служб и посмотреть, есть ли какие-либо недавние изменения, которые могли бы объяснить ваши проблемы. Особенно важно проверять изменения в следующих обстоятельствах:

  • Код службы переднего плана, который раньше работал, теперь дает сбой
  • Вы только что начали тестирование на новой версии платформы или изменили уровень API, на который нацелено ваше приложение.

Кроме того, если вы тестируете свое устройство на платформе Developer Preview, обязательно ознакомьтесь с последней версией документации Developer Preview .

Ошибки «Приложение не отвечает» (ANR)

При определенных обстоятельствах ожидается, что приложение завершит свою службу переднего плана. Если приложение не останавливает службу, система останавливает службу и выдает ошибку Application Not Responding (ANR).

Короткие рейсы слишком длинные, что приводит к ANR

Службы переднего плана, использующие тип службы short, должны завершаться быстро, в течение примерно трех минут. Когда время истекает, система вызывает метод Service.onTimeout(int,int) службы. У службы есть несколько секунд, чтобы вызвать stopSelf() . Если служба не останавливается сама, система выдает ошибку Application Not Responding.

Диагностика :

Если ANR была вызвана тем, что служба переднего плана не смогла остановить себя, система выдает внутреннее исключение. Вы можете убедиться, что проблема была в этом, проверив отчеты ANR. Если проблема в этом, отчет будет включать следующее сообщение:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type FOREGROUND_SERVICE_TYPE_SHORT_SERVICE did not stop within its timeout:
[component name]"

Исправить :

Убедитесь, что все ограниченные по времени службы переднего плана завершили свою работу и вызвали stopForeground(int) в течение системного лимита времени.

Реализуйте Service.onTimeout(int,int) на ваших передних службах. Убедитесь, что ваша реализация этого метода сразу же вызывает stopSelf() .

Исключения приоритетных служб

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

В некоторых случаях система выдает внутреннее исключение. В таких случаях вы можете узнать, что это было за исключение, посмотрев в трассировку стека , а также можете проверить Logcat для получения более подробной информации об ошибке.

Внутреннее исключение: превышено время ожидания

Система накладывает ограничение на то, как долго службы синхронизации данных и обработки мультимедиа могут работать на переднем плане, пока приложение находится в фоновом режиме. Если служба превышает этот предел, система вызывает метод Service.onTimeout(int,int) службы. У службы есть несколько секунд, чтобы вызвать stopSelf() . Если служба не останавливается сама, система генерирует внутреннее исключение RemoteServiceException , вызывающее сбой приложения.

Диагностика :

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

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

Исправить :

Убедитесь, что все ограниченные по времени службы переднего плана завершили свою работу и вызвали stopForeground(int) в течение системного лимита времени.

Реализуйте Service.onTimeout(int,int) на ваших передних службах. Убедитесь, что ваша реализация этого метода сразу же вызывает stopSelf() .

Внутреннее исключение: ForegroundServiceDidNotStartInTimeException

Когда вы запускаете службу, вызывая context.startForegroundService() , у этой службы есть несколько секунд, чтобы перевести себя в режим переднего плана, вызвав ServiceCompat.startForeground() . Если служба этого не делает, она выдает внутреннее исключение ForegroundServiceDidNotStartInTimeException .

Диагностика :

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

android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()

Исправить :

Убедитесь, что все вновь созданные службы переднего плана вызывают ServiceCompat.startForeground() в течение нескольких секунд.

ForegroundServiceStartNotAllowedException

Ошибка :

Система выдает исключение ForegroundServiceStartNotAllowedException .

Причина :

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

Начиная с Android 12 (API уровня 31), приложениям не разрешено запускать службы переднего плана, пока приложение работает в фоновом режиме , за несколькими особыми исключениями . Если вы пытаетесь запустить службу переднего плана из фонового режима и не соответствуете требованиям одного из исключений, система выдает исключение ForegroundServiceStartNotAllowedException . Система также делает это, если вы не соответствуете требованиям исключения.

Например, приложение может иметь кнопку, которую пользователь может нажать, что заставит приложение выполнить некоторую обработку, а затем запустить службу переднего плана. В этом случае есть опасность, что пользователь может нажать кнопку, а затем немедленно перевести приложение в фоновый режим. Затем приложение попытается запустить службу из фонового режима. Если приложение не соответствует ни одному из указанных исключений, система выдает исключение ForegroundServiceStartNotAllowedException .

Кроме того, некоторые исключения имеют короткий временной лимит. Например, есть краткое исключение, если ваше приложение запускает службу переднего плана в ответ на высокоприоритетное сообщение FCM. Если вы не запустите службу достаточно быстро, вы получите ForegroundServiceStartNotAllowedException .

Конкретные исключения иногда становятся более строгими с новыми выпусками Android. Если вы изменили версию Android, на которую нацелено ваше приложение, проверьте изменения в документации по службам переднего плана и убедитесь, что ваше приложение по-прежнему соответствует одному из разрешенных исключений.

Исправить :

Измените рабочий процесс вашего приложения так, чтобы ему не приходилось запускать службы переднего плана, пока приложение находится в фоновом режиме, или подтвердите, что ваше приложение соответствует одному из исключений.

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

SecurityException

Ошибка :

Система выдает SecurityException .

Причина :

Ваше приложение попыталось запустить службу переднего плана, не имея необходимых разрешений.

  • Если приложение предназначено для Android 9 (уровень API 28) или выше, оно должно иметь разрешение FOREGROUND_SERVICE для запуска службы переднего плана.
  • Если приложение нацелено на Android 14 (API уровня 34) или выше, оно должно соответствовать всем предварительным условиям для своего типа службы переднего плана. Эти предварительные условия подробно описаны в документации по типам служб переднего плана . В частности, следует учитывать следующие требования:
    • Несколько типов служб переднего плана требуют определенных разрешений времени выполнения. Например, служба переднего плана удаленного обмена сообщениями должна иметь разрешение FOREGROUND_SERVICE_REMOTE_MESSAGING .
  • В нескольких случаях существуют дополнительные ограничения while-in-use на разрешения, необходимые некоторым типам служб переднего плана. Эти разрешения предоставляются приложению только во время работы приложения на переднем плане ( за некоторыми исключениями ). Это означает, что даже если ваше приложение запросило и получило одно из этих разрешений, если приложение попытается запустить службу переднего плана, пока приложение находится в фоновом режиме, система выдаст исключение SecurityException , даже если у приложения есть исключение для запуска службы переднего плана из фонового режима. Для получения дополнительной информации см. Ограничения на запуск служб переднего плана, которым требуются разрешения while-in-use .
    • Вы можете получить исключение SecurityException , если вы запросили необходимые разрешения, но запустили службу переднего плана, не подтвердив, что требуемые разрешения были предоставлены.

Исправить :

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

,

На этой странице обсуждаются некоторые распространенные причины сбоев в работе приоритетных служб, а также помощь в определении причины проблемы.

В этом документе обсуждаются следующие вопросы:

Прежде чем приступить к устранению неполадок

Проверьте последние изменения в приоритетных службах

Если службы переднего плана используются неправильно, они могут иметь негативные последствия для производительности устройства и срока службы батареи. По этой причине выпуски платформы Android часто вносят изменения в поведение служб переднего плана, чтобы ограничить эти плохие последствия.

Если у вас возникли проблемы с передовыми службами, вам следует проверить изменения в документации передовых служб и посмотреть, есть ли какие-либо недавние изменения, которые могли бы объяснить ваши проблемы. Особенно важно проверять изменения в следующих обстоятельствах:

  • Код службы переднего плана, который раньше работал, теперь дает сбой
  • Вы только что начали тестирование на новой версии платформы или изменили уровень API, на который нацелено ваше приложение.

Кроме того, если вы тестируете свое устройство на платформе Developer Preview, обязательно ознакомьтесь с последней версией документации Developer Preview .

Ошибки «Приложение не отвечает» (ANR)

При определенных обстоятельствах ожидается, что приложение завершит свою службу переднего плана. Если приложение не останавливает службу, система останавливает службу и выдает ошибку Application Not Responding (ANR).

Короткие рейсы слишком длинные, что приводит к ANR

Службы переднего плана, использующие тип службы short, должны завершаться быстро, в течение примерно трех минут. Когда время истекает, система вызывает метод Service.onTimeout(int,int) службы. У службы есть несколько секунд, чтобы вызвать stopSelf() . Если служба не останавливается сама, система выдает ошибку Application Not Responding.

Диагностика :

Если ANR была вызвана тем, что служба переднего плана не смогла остановить себя, система выдает внутреннее исключение. Вы можете убедиться, что проблема была в этом, проверив отчеты ANR. Если проблема в этом, отчет будет включать следующее сообщение:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type FOREGROUND_SERVICE_TYPE_SHORT_SERVICE did not stop within its timeout:
[component name]"

Исправить :

Убедитесь, что все ограниченные по времени службы переднего плана завершили свою работу и вызвали stopForeground(int) в течение системного лимита времени.

Реализуйте Service.onTimeout(int,int) на ваших передних службах. Убедитесь, что ваша реализация этого метода сразу же вызывает stopSelf() .

Исключения приоритетных служб

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

В некоторых случаях система выдает внутреннее исключение. В таких случаях вы можете узнать, что это было за исключение, посмотрев в трассировку стека , а также можете проверить Logcat для получения более подробной информации об ошибке.

Внутреннее исключение: превышено время ожидания

Система накладывает ограничение на то, как долго службы синхронизации данных и обработки мультимедиа могут работать на переднем плане, пока приложение находится в фоновом режиме. Если служба превышает этот предел, система вызывает метод Service.onTimeout(int,int) службы. У службы есть несколько секунд, чтобы вызвать stopSelf() . Если служба не останавливается сама, система генерирует внутреннее исключение RemoteServiceException , вызывающее сбой приложения.

Диагностика :

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

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

Исправить :

Убедитесь, что все ограниченные по времени службы переднего плана завершили свою работу и вызвали stopForeground(int) в течение системного лимита времени.

Реализуйте Service.onTimeout(int,int) на ваших передних службах. Убедитесь, что ваша реализация этого метода сразу же вызывает stopSelf() .

Внутреннее исключение: ForegroundServiceDidNotStartInTimeException

Когда вы запускаете службу, вызывая context.startForegroundService() , у этой службы есть несколько секунд, чтобы перевести себя в режим переднего плана, вызвав ServiceCompat.startForeground() . Если служба этого не делает, она выдает внутреннее исключение ForegroundServiceDidNotStartInTimeException .

Диагностика :

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

android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()

Исправить :

Убедитесь, что все вновь созданные службы переднего плана вызывают ServiceCompat.startForeground() в течение нескольких секунд.

ForegroundServiceStartNotAllowedException

Ошибка :

Система выдает исключение ForegroundServiceStartNotAllowedException .

Причина :

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

Начиная с Android 12 (API уровня 31), приложениям не разрешено запускать службы переднего плана, пока приложение работает в фоновом режиме , за несколькими особыми исключениями . Если вы пытаетесь запустить службу переднего плана из фонового режима и не соответствуете требованиям одного из исключений, система выдает исключение ForegroundServiceStartNotAllowedException . Система также делает это, если вы не соответствуете требованиям исключения.

Например, приложение может иметь кнопку, которую пользователь может нажать, что заставит приложение выполнить некоторую обработку, а затем запустить службу переднего плана. В этом случае есть опасность, что пользователь может нажать кнопку, а затем немедленно перевести приложение в фоновый режим. Затем приложение попытается запустить службу из фонового режима. Если приложение не соответствует ни одному из указанных исключений, система выдает исключение ForegroundServiceStartNotAllowedException .

Кроме того, некоторые исключения имеют короткий временной лимит. Например, есть краткое исключение, если ваше приложение запускает службу переднего плана в ответ на высокоприоритетное сообщение FCM. Если вы не запустите службу достаточно быстро, вы получите ForegroundServiceStartNotAllowedException .

Конкретные исключения иногда становятся более строгими с новыми выпусками Android. Если вы изменили версию Android, на которую нацелено ваше приложение, проверьте изменения в документации по службам переднего плана и убедитесь, что ваше приложение по-прежнему соответствует одному из разрешенных исключений.

Исправить :

Измените рабочий процесс вашего приложения так, чтобы ему не приходилось запускать службы переднего плана, пока приложение находится в фоновом режиме, или подтвердите, что ваше приложение соответствует одному из исключений.

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

SecurityException

Ошибка :

Система выдает SecurityException .

Причина :

Ваше приложение попыталось запустить службу переднего плана, не имея необходимых разрешений.

  • Если приложение предназначено для Android 9 (уровень API 28) или выше, оно должно иметь разрешение FOREGROUND_SERVICE для запуска службы переднего плана.
  • Если приложение нацелено на Android 14 (API уровня 34) или выше, оно должно соответствовать всем предварительным условиям для своего типа службы переднего плана. Эти предварительные условия подробно описаны в документации по типам служб переднего плана . В частности, следует учитывать следующие требования:
    • Несколько типов служб переднего плана требуют определенных разрешений времени выполнения. Например, служба переднего плана удаленного обмена сообщениями должна иметь разрешение FOREGROUND_SERVICE_REMOTE_MESSAGING .
  • В нескольких случаях существуют дополнительные ограничения while-in-use на разрешения, необходимые некоторым типам служб переднего плана. Эти разрешения предоставляются приложению только во время работы приложения на переднем плане ( за некоторыми исключениями ). Это означает, что даже если ваше приложение запросило и получило одно из этих разрешений, если приложение попытается запустить службу переднего плана, пока приложение находится в фоновом режиме, система выдаст исключение SecurityException , даже если у приложения есть исключение для запуска службы переднего плана из фонового режима. Для получения дополнительной информации см. Ограничения на запуск служб переднего плана, которым требуются разрешения while-in-use .
    • Вы можете получить исключение SecurityException , если вы запросили необходимые разрешения, но запустили службу переднего плана, не подтвердив, что требуемые разрешения были предоставлены.

Исправить :

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