В данной статье мы рассмотрим проблему, с которой сталкиваются разработчики, использующие Delphi для создания кроссплатформенных приложений под Android. Особое внимание будет уделено изменениям в политике запуска сервисов, внесенным в Android с версии 8 и выше, и предложим решение этой проблемы.
Описание проблемы
С версии Android 8.0 (Oreo) была введена новая политика запуска фоновых сервисов, которая требует, чтобы сервисы, запущенные из фонового состояния приложения, использовали метод startForegroundService. Это изменение было направлено на повышение безопасности и оптимизацию работы системы.
Разработчики, использующие Delphi для создания Android-приложений, столкнулись с ошибкой java.lang.IllegalStateException: Not allowed to start Intent ... app is in background uid null, когда попытались запустить сервис на устройствах с Android 8 и выше. Приложение, созданное в Delphi 10.3, успешно запускало и мониторило сервис на устройствах с Android 7, но начиная с версии 8, сервис перестал запускаться.
Решение проблемы
Для корректной работы сервиса на устройствах с Android 8 и выше необходимо использовать метод startForegroundService. Этот метод требует, чтобы сервис как можно быстрее начал отображать уведомление, сообщающее пользователю о том, что сервис работает. Таким образом, Android будет знать, что сервис выполняет важную задачу, и не прервет его работу.
function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
// Здесь должен быть код, который запускает уведомление для сервиса
Result := TJService.JavaClass.START_STICKY;
end;
Подтвержденный ответ
В контексте найденного решения (https://stackoverflow.com/questions/46445265/android-8-0-java-lang-illegalstateexception-not-allowed-to-start-service-intent) указывается, что для работы сервиса в фоне на Android 8 и выше необходимо использовать startForegroundService. Также предоставлен пример демо-проекта (https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/ForegroundService), который демонстрирует, как сервис может самостоятельно перейти в состояние "в фоне".
Альтернативный ответ
В качестве альтернативного подхода можно использовать встроенные средства Delphi для запуска сервиса, используя компонент TLocalServiceConnection. Однако для запуска сервиса из внешнего приложения потребуется реализация дополнительных механизмов, таких как обработка событий и передача команд.
Заключение
При разработке кроссплатформенных приложений на Delphi для Android важно учитывать изменения в политике работы сервисов, введенные в Android 8.0 и последующих версиях. Использование startForegroundService и реализация механизма отображения уведомлений позволит обеспечить корректную работу сервисов на новых версиях операционной системы.
Эта статья предназначена для разработчиков, сталкивающихся с проблемой запуска сервисов в новых версиях Android и ищущих решение с использованием инструментов Delphi.
Создание кроссплатформенных приложений на Delphi для запуска фоновых сервисов на Android 8 и выше требует использования `startForegroundService` и реализации отображения уведомлений для соответствия новым требованиям операционной системы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS