Delphi - служба Android запускается через AlarmManager и вызывается только один разAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Delphi - служба Android запускается через AlarmManager и вызывается только один раз

Сообщение Anonymous »

У меня есть мобильное приложение на Delphi, которое выполняет определенную операцию мыла каждые две минуты, однако у меня были проблемы с задержками при переходе в глубокий сон. С предыдущих 2 минут задержка могла увеличиться до 30 минут в зависимости от производителя телефона (я использовал обычный сон с вкраплениями уведомлений). Итак, после некоторого времени выяснения, что с этим делать, я хотел бы переключиться на AlarmManager (WorkManager еще не реализован в версии Delphi, в которой я работаю), который может запускать данную службу. В настоящее время у меня есть служба, созданная как удаленная служба. Благодаря @Dalija Prasnikar я добился некоторого прогресса, но теперь у меня проблема с повторением моей службы, она вызывается только один раз.
Я пытался уменьшить интервал тревоги до минимально допустимого, поскольку API Android 19 (1 минута), но без изменений.
Это вызывается при нажатии кнопки «Пуск»:

Код: Выделить всё

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

PendingIntent := TJPendingIntent.JavaClass.getService(TAndroidHelper.Context, 0, Intent, TJPendingIntent.JavaClass.FLAG_UPDATE_CURRENT);

TAndroidHelper.AlarmManager.setRepeating(TJAlarmManager.JavaClass.RTC_WAKEUP, 0, getTimeAfterInSecs(120),
PendingIntent);
except
on E: Exception do
Log(E.Message);
end;
end;

function TMainForm.getTimeAfterInSecs(Seconds: Integer): Int64;
var
Calendar: JCalendar;
begin
Calendar := TJCalendar.JavaClass.getInstance;
Calendar.add(TJCalendar.JavaClass.SECOND, Seconds);
Result := Calendar.getTimeInMillis;
end;
end.
У RemoteService есть следующие объявления:

Код: Выделить всё

public
function DoStartCommand(const AStartIntent: JIntent; AFlags, AStartID: Integer): Integer; override;
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 TRemoteServiceDM.DoStartCommand(const AStartIntent: JIntent; AFlags,
AStartID: Integer): Integer;
begin
try
AcquireWakeLock;
try
//test
GetSOAPService().HelloWorld;
except
on E: Exception do
Log(E.Message);
end;

ReleaseWakeLock;
except
on E: Exception do
Log(E.Message);
end;
Result := TJService.JavaClass.START_STICKY;
end;
Есть идеи, почему процесс не повторяется?
Тестовым устройством является Android 11, Galaxy A12.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -only-once
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»