我在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”在基类中找不到。
就像编译器错误所说,后代类
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;