I am currently rotating around a little "problem".
I have an App with a service. This service needs reliably start once very 24 hours to do something (time of day is irrelevant just every 24 hours). I selected the StartAtBoot. And in the Main Activity_create I added the line in
If FirstTime AND IsPaused("some_service") Then StartService("some_service")
and in the service_start of the service
StartServiceAt("some_service", DateTime.Now + DateTime.TicksPerday, True)
and then some code.
Problem is now it fires almost every time the main activity is started. This behavior is normal for the app gets killed by the system and is created new.
Now I thought about putting If StartingIntent.ExtrasToString.IndexOf("ALARM_COUNT") = -1 Then Return in the service_start in front of the startserviceat.
My concern is now if for some reason the scheduled service is canceled then the code will never be executed. The question is now: how reliably will the service run every 24 hours if I remove the code from the activity_create? Is it enough to set start at boot and then reschedule the service? Would there not be any way to get a list of scheduled services and just make sure?
After doing a bit searching I found that the Alarmmanager could return the schedule. For this one would have to create an exact same alarm again and retrieve its schedule. That means basically it is possible to get the schedule of one specific alarm. Are the StartServiceAt scheduled using the Alarmmanager? If so it would be possible to do something like a GetServiceSchedule("service_name"). Is there any info on how the Services are scheduled in B4A?
StartServiceAt does use AlarmManager. However I think that my suggestion will work better in any way. Let the service decide whether it needs to execute the task or not. Why limit it to a specific intent?
Thanks for the reply. It just seems a bit cleaner to actually test if the service is scheduled instead of starting it over again and letting it decide. Is there any documentation on how the AlarmManager is used in B4A with the service name or is there any way to look at the generated code? I would like to try and make a lib to get the scheduled time of a specific service.
Great, thanks Erel! I will see if it works and post the result. I suppose "Service" in StartServiceAt(BA mine, Object Service... and getComponentIntent(mine, Service) needs to be substituted with the service module name?