如何通过AlarmManager在Delphi android服务中启动?

问题描述 投票:0回答:1

我在delphi中有一个移动应用程序,每两分钟运行一次肥皂操作,但是当它进入深度睡眠时,我遇到了时间延迟的问题。从之前的 2 分钟开始,延迟可能会增加最多 30 分钟,具体取决于手机制造商(我使用的是普通睡眠,中间夹杂着通知)。因此,经过一段时间的思考后,我想切换到一个可以运行给定服务的 AlarmManager(我使用的 delphi 版本中尚未实现 WorkManager)。我目前有一个服务编写为远程服务,我正在运行绑定(用于通信)。但我坚持启动我的服务 - 我不知道使用 AlarmManager 时需要重写哪些程序,以及它是否可以这样使用(我只能找到启动 Activity 的示例)

一个简短的例子或方向将不胜感激。

单击开始按钮时调用此函数:

procedure TMainForm.SetupAlarm();
var
  Intent: JIntent;
  PendingIntent: JPendingIntent;
begin
  Intent := TJIntent.Create;
  Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.services.RemoteService'));

  PendingIntent := TJPendingIntent.JavaClass.getActivity(TAndroidHelper.Context, 1, Intent, 0);

  TAndroidHelper.AlarmManager.setRepeating(TJAlarmManager.JavaClass.RTC_WAKEUP, 0, getTimeAfterInSecs(120),
        PendingIntent);
end;

RemoteService 有以下声明:

public
    WakeLock: JPowerManager_WakeLock;
    procedure AcquireWakeLock;
    procedure ReleaseWakeLock;
  end;

实施:

procedure TRemoteServiceDM.ReleaseWakeLock;
begin
  if Assigned(WakeLock) and WakeLock.isHeld then
    WakeLock.release;
end;

procedure TRemoteServiceDM.AcquireWakeLock;
var
  PowerManager: JPowerManager;
begin
  PowerManager := TJPowerManager.Wrap(
    TAndroidHelper.Context.getSystemService(TJContext.JavaClass.POWER_SERVICE));

  WakeLock := PowerManager.newWakeLock(TJPowerManager.JavaClass.PARTIAL_WAKE_LOCK, StringToJString('YourWakeLockTag'));
  WakeLock.acquire;
end;

我认为应该如何触发它?:

 function OnStartCommand(Intent: JIntent; Flags, StartId: Integer): Integer; override;

function TRemoteServiceDM.onStartCommand(Intent: JIntent; Flags,
  StartId: Integer): Integer;
begin
  AcquireWakeLock;
  //logic here
  //...
  ReleaseWakeLock;
end;

TRemoteService 类扩展了 TAndroidService。 但是“OnStartCommand”返回错误“Method OnStartCommand”在基类中找不到。

android delphi alarmmanager firemonkey
1个回答
0
投票

就像编译器错误所说,后代类

OnStartCommand
或其后代中没有
TAndroidService
方法,因此您不能使用
override
指令。

如果你看一下源代码

System.Android.Service
,你会发现有一个虚拟的
DoStartCommand
方法,你可能想重写那个方法。

function DoStartCommand(const AStartIntent: JIntent; AFlags, AStartID: Integer): Integer; virtual;

TAndroidService
具有
OnStartCommand
类型的
TOnStartCommandEvent
事件处理程序属性,这可能是混乱的根源。

TOnStartCommandEvent = function(const Sender: TObject; const Intent: JIntent;
  Flags, StartId: Integer): Integer of object;
© www.soinside.com 2019 - 2024. All rights reserved.