问题描述
我用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。)!