Delphi 10 SeattleのAndroidアプリケーションで、パラメータをつけてServiceを起動する

Delphi 10 SeattleからAndroidアプリケーションでServiceを作成できるようになりました。

Serviceは「TLocalServiceConnection.StartService(サービス名);」で起動できます。
簡単ですね。

ですが、情報を付加してServiceを起動したいこともあります。
そのような便利機能は用意されていないようです。

そこで、自分でIntentを作成して、putExtraメソッドを使って情報を渡します。
こんな感じの関数を用意します。

function CreateIntent(const AServiceName: string; I: Integer; S: string): JIntent;
var
  ServiceName: string;
begin
  Result := TJIntent.Create;
  ServiceName := AServiceName;
  if not ServiceName.StartsWith('com.embarcadero.services.') then
    ServiceName := 'com.embarcadero.services.' + ServiceName;
  Result.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString(ServiceName));
  Result.putExtra(TAndroidHelper.StringToJString('Int'), I);
  Result.putExtra(TAndroidHelper.StringToJString('Str'), TAndroidHelper.StringToJString(S));
end;

こんな感じでSenderを起動します。

procedure TForm1.Button1Click(Sender: TObject);
var
  Intent: JIntent;
begin
  Intent := CreateIntent(SERVICE_NAME, 987, 'テスト');
  TAndroidHelper.Activity.startService(Intent);
end;

サービス側では、OnStartCommandイベントで送られたパラメータを受け取ります。

function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
var
  Int: Integer;
  Str: string;
begin
  Int := Intent.getIntExtra(TAndroidHelper.StringToJString('Int'), -1);
  Str := TAndroidHelper.JStringToString
    (Intent.getStringExtra(TAndroidHelper.StringToJString('Str')));

  // 何らかの処理

  Result := TJService.JavaClass.START_STICKY;
end;

これで、サービスを起動するときにパラメータを送ることができました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください