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;
これで、サービスを起動するときにパラメータを送ることができました。