Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разработка кроссплатформенных приложений на Delphi: запуск сервисов на Android 8 и выше

Delphi , Программа и Интерфейс , Процессы и Сервисы

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

Пример кода на Object Pascal (Delphi)

procedure TfrmStarter.StartBLEService;
var
    Intent : JIntent;
    NativeComponent : JComponentName;
    PackageName, AppName : JString;
begin
    PackageName := StringToJString('com.embarcadero.LysaAdmin');
    AppName := StringToJString('com.embarcadero.services.BLEService');

    Intent := TJIntent.Create;
    Intent.setAction(TJIntent.JavaClass.ACTION_STARTForegroundService);
    Intent.addCategory(TJIntent.JavaClass.CATEGORY_DEFAULT);
    NativeComponent := TJComponentName.JavaClass.init(PackageName, AppName + '/.Main');
    Intent.setComponent(NativeComponent);
    Intent.addFlags(TJIntent.FLAG_ACTIVITY_NEW_TASK or TJIntent.FLAG_IMPORTANCE_DEFAULT);
    Intent.putExtra('command', 'startforeground');

    SharedActivity.startForegroundService(Intent);
end;

Код метода StartCommand сервиса

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




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


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-09-02 16:16:24/0.0035049915313721/0