The above hints don't seem to mention the 'Scheduler'. I had saved an original post by Erel on 'Service'.
https://www.b4x.com/android/forum/threads/service-modules.7542/
but I can't seem to find how I added the 'Scheduler' to create an alert system.
I have been using the logic below for 2 years. It gives me an alert every morning at 7:00am (user defined) whether there are alerts or not. If my calendar events include alert times, an earlier time will override tomorrow's 7am alert. When the earlier alert is fired, than the next alert, etc. If there are no other alerts in the day, the 7am tomorrow alert is set.
The alerts are fired whether the app is active or not so long as the phone is on. I have noticed that the 7am alerts can fire anytime from 7am to 7:04am, so if you need an exact time, you might want to subtract 5 minutes or so from the time to give a little lee-way. I have not noticed any degradation of the battery as I leave my phone on charging all night.
This is the 'FSService' routine in its entirety. Not much there except it fires the 'Scheduler'. You can load it from the attachments below. It must be loaded as a 'service'.
#Region Service Attributes
#StartAtBoot: False
#End Region
Sub Process_Globals
End Sub
Sub Service_Create
End Sub
Sub Service_Start (StartingIntent As Intent)
StartServiceAt (Scheduler, DateTime.now,False)
End Sub
Sub Service_Destroy
End Sub
This is the 'Scheduler'.
1. Note that it calls starter.GetNotifications to read a sql file of events/times/alert times.
2. There is also a public variable in Starter (Starter.SNotifTime) that is set in my setup to store the default alert time (mine is 7:00am).
3. As you will note, Scheduler finds the next alert time including that in starter.snotiftime and then chooses the next time.
4. You can use normal datetimes for all this. My data happened to use strings of date time as you will note.
5. Also note that I have set up starter variables for the sound/vibrate combinations. These are in my setup.
6. Once all this is set you can actually format a message as shown. I have kept mine generic but you could put the event title in the message if you want.
7. Also note you can issue multiple alerts.
8. Finally, the logic fires the alert and schedules the next alert.
Again, you can load it from the attachment below as a 'Service'.
#Region Service Attributes
#StartAtBoot: true
#End Region
Sub Process_Globals
Public NextStartTime, OtherStartTime As Double
Public X1, X2, sNotes1, sNotes2 As String
Public i As Int
End Sub
Sub Service_Create
End Sub
Sub Service_Start (StartingIntent As Intent)
StartSchedule
End Sub
public Sub StartSchedule
Dim ITime As Int
Starter.getnotifications
If Starter.SNotifTime.trim.CompareTo("")=0 Then Starter.SNotifTime=0
If Starter.SNotifTime>0 Then
DateTime.DateFormat="HHmmss"
ITime=DateTime.date (DateTime.Now+DateTime.TicksPerMinute)
If ITime< Starter.SNotifTime & "00" Then
NextStartTime=DateTime.Now
Else
NextStartTime=DateTime.Add(DateTime.now,0,0,1)
End If
DateTime.DateFormat="yyyyMMddHHmm"
X1=DateTime.Date (NextStartTime)
X2=NumberFormat(Starter.SNotifTime,4,0)
X2=X2.SubString2(0,1) & X2.SubString2(2,5)
X1=X1.SubString2(0,8) & X2
NextStartTime=DateTime.DateParse(X1)
If Starter.NextAlerttime.CompareTo("300012312400") <>0 Then
If Starter.NextAlertTime.CompareTo(X1) <0 Then
NextStartTime=DateTime.DateParse(Starter.nextalerttime)
End If
End If
DateTime.DateFormat="yyyy/MM/dd HH:mm"
X1=DateTime.Date (NextStartTime)
Dim n As Notification
n.Initialize
n.Sound=False
n.Vibrate=False
n.Icon="icon"
If Starter.SNotif.Size>0 Then
sNotes1="FS has alerts for you. Touch here."
If Starter.SnotifSound=1 Then n.Sound = True
If Starter.SnotifSound=3 Then n.Sound = True
If Starter.SnotifSound=2 Then n.Vibrate = True
If Starter.SnotifSound=3 Then n.vibrate = True
If Starter.Notifications=False Then
Starter.NextStartTime=0
Starter.Notifications=True
End If
Else
sNotes1="FS has no alerts for today."
If Starter.Notifications=True Then
Starter.NextStartTime=0
Starter.Notifications=False
End If
End If
sNotes2= "Next Notification at: " & X1
If Starter.NextstartTime<>NextStartTime Then
n.SetInfo(sNotes1,sNotes2, "Main")
Log (sNotes1 & CRLF & sNotes2)
n.Notify(1)
StartServiceAt (FSService, NextStartTime,False)
Starter.NextStartTime=NextStartTime
End If
End If
End Sub
Sub Service_Destroy
End Sub
This code is in B4XMainPage.b4xpage_appear to fire the scheduler if there has been an update to an event and possibly reset the alert time.
1. Updates to events in my system turn off the boolean starter.bnotif and then return to the main menu.
2. sub BuildNotify populates a clv on the main menu with the events for the next 3 days in date/time order.
If Starter.bNotif=False Then
Starter.getnotifications
StartServiceAt (Scheduler, DateTime.now,False)
Log ("Notifications rebuilt")
Starter.bNotif=True
End If
BuildNotif
FSService and Scheduler are attached. You can load them and modify as desired. Both have to be loaded as 'Services'.
Hope this helps. Cliff