Delphi无法启动高于Android 8版本的Android Service

问题描述

我用Delphi 10.3完成的应用正在启动并监视Android版本7上的android服务。 但是在Android版本8之上,我得到了错误

java.lang.IllegalStateException: 不允许启动Intent ... 应用程序在后台uid中为空

发现从版本8开始,Android更改了政策。我应该使用startForegroundService,但是我不清楚如何响应服务以通知Android并允许启动。 (并且找不到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_MAIN);
    Intent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER);
    NativeComponent := TJComponentName.JavaClass.init(PackageName,AppName);
    Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    Intent.setComponent(NativeComponent);
    SharedActivity.startService(Intent);   //<< This work's fine Android 7

   // SharedActivity.startForegroundService(Intent); //<< Android 8.1 not getting errors but service is not started
end;

服务StartCommand代码

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags,StartId: Integer): Integer;
begin
 Result := TJService.JavaClass.START_STICKY; 
end;

解决方法

Delphi提供了在一行中启动服务的功能

用途 System.Android.Service;

...

TLocalServiceConnection.StartService('service_name');

service_name-仅服务名称,不带包(com.embarcadero。)!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...