我使用 Delphi 10.3 完成的应用程序正在 Android 版本 7 上成功启动并监控我的 Android 服务。 但在 Android 版本 8 以上我收到错误:
java.lang.IllegalStateException: 不允许启动Intent... 应用程序在后台 uid null
发现从版本 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;
服务启动命令代码
function TDM.AndroidServiceStartCommand(const Sender: TObject;
const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
Result := TJService.JavaClass.START_STICKY;
end;
最佳答案
Delphi 提供了一行启动服务的能力
用途 系统.Android.Service;
...
TLocalServiceConnection.StartService('service_name');
service_name - 只是服务名称,没有包(com.embarcadero。)!
关于android - Android 8以上版本Delphi无法启动Android Service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64124054/