0

我知道如何将数据发送到远程后台 android 服务:

.
.
FServiceConnection: TRemoteServiceConnection;
.
.
procedure TForm1.Button1Click(Sender: TObject);
const
  GET_STRING = 1234;
var
  LMessage: JMessage;
begin
  FServiceConnection := TRemoteServiceConnection.Create;
  FServiceConnection.BindService('Name of the APK containing service', 'Service name');

  LMessage := TJMessage.JavaClass.obtain(nil, GET_STRING);
  LMessage.replyTo := FServiceConnection.LocalMessenger;
  FServiceConnection.ServiceMessenger.send(LMessage);
end;

但是本地android服务怎么做呢?

.
.
FServiceConnection: TLocalServiceConnection;
.
.
procedure TForm1.Button1Click(Sender: TObject);
const
  GET_STRING = 1234;
var
  LMessage: JMessage;
begin
  FServiceConnection := TLocalServiceConnection.Create;
  FServiceConnection.BindService('Service name');

  LMessage := TJMessage.JavaClass.obtain(nil, GET_STRING);
  ????
  ????
end;

还是有另一种方式在应用程序和后台 android 本地服务之间发送消息?

建议你们中的某个人解决这个问题?

4

3 回答 3

1

实际上,您可以将消息发送到本地服务。Pax Beach 显示的答案将使我的服务崩溃,但如果我只是按照下面的操作进行操作,它将非常有效:

function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  if (JStringToString(Intent.getAction) = 'StopIntent') then
  begin
       Result := TJService.JavaClass.START_NOT_STICKY;
       JavaService.stopSelf;
       Exit;
  end;
  (....)
end;
于 2017-07-16T01:12:00.707 回答
1

我在我的 Android 本地服务中使用 ServiceStartCommand 事件来实现它。

按下 HOST 应用程序活动上的按钮以向服务发送包装在 JIntent 中的“启动命令”。

procedure TForm3.Button1Click(Sender: TObject);
var
  LIntent: JIntent;
begin
  Log.D('Try to start');
  LIntent := TJIntent.Create;
  LIntent.setClassName(TAndroidHelper.Context.getPackageName(),
    TAndroidHelper.StringToJString('com.embarcadero.services.SvcTimer'));
  LIntent.setAction(StringToJString('StartIntent'));
  TAndroidHelper.Activity.startService(LIntent);
end;

该服务获得一个命令并测试我的 JIntent,与一个有什么关系。

function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent;
  Flags, StartId: Integer): Integer;
begin
  Log('+ START with Intent: ' + JStringToString(Intent.getAction.toString), []);
  if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then
  begin
    Log('... service to be stoped', []);
...
    JavaService.stopSelf;
    Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service
    Log('- service stoped', []);
  end
  else if Intent.getAction.equalsIgnoreCase(StringToJString('StartIntent')) then
  begin
...
    LocationSensor.Active := True;
    Result := TJService.JavaClass.START_STICKY; // rerun service if it stops
    Log('+ Service started', []);
  end;
end;

因此,我们执行主机应用程序命令。

于 2016-06-05T16:34:54.630 回答
-3

无法在 LocalServices 中处理消息……仅在远程服务中。

见: http: //pt.slideshare.net/jimmckeeth/creating-android-services-with-delphi-and-rad-studio-10-seattle

于 2016-01-07T18:30:04.050 回答