Hola Psdos:
Varias cosas, seria interesante que antes de bloquear o desbloquear la pantalla, primero comprobaras en que estado está, y dependiendo de este actuar:
Sub ComprobarBloqueoPantalla As Boolean
dim PantallaBloqueada as boolean
r.Target = r.GetContext
r.Target = r.RunMethod2("getSystemService", "keyguard", "java.lang.String")
PantallaBloqueada = r.RunMethod("inKeyguardRestrictedInputMode")
Return PantallaBloqueada
End Sub
Si añades en el servicio:
#Region Service Attributes
#StartCommandReturnValue: android.app.Service.START_STICKY
harás que el sistema al matar el servicio lo vuelva a ejecutar (
https://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/ )
La inicialización del temporizador mejor que la quites donde está, por que si ocurre mas de una vez sin salir de la aplicación (girando la pantalla por ejemplo) te va a crear varias instancias del evento y te volverás loco cuando te ejecute el codigo n veces . Deja donde has puesto el habilitarlo. Y tambien pasa el inicializar las TTS. y Pones en el
Sub Process_Globals la declaración del temporizador
Sub Activity_Create(FirstTime As Boolean)
If FirstTime Then
' pon tambien el timer1
Timer2.Initialize("Timer2", 5000)
TTS1.Initialize("TTS1")
TTS1.SetLanguage("es_SP","")
end if
El servicio no lo matas solo con
CancelScheduledService(DeviceWakupService) , con eso para las llamadas pendientes que has echo con
StartServiceAt , para pararlo debes :
StopService(DeviceWakupService)
Otro problema es que "te comeras" la bateria llamando a un servicio cada segundo, si sabes que quieres dar el aviso a las 12 en punto (o cualquier otra hora), haz una llamada al
StartServiceAt restando el tiempo actual a esa hora de la alarma.
De la forma que has planteado la aplicación, "siempre" estará activa, por tanto un servicio no tiene sentido, y digo siempre, por que depende de los ajustes, al tiempo se apagará la pantalla y tu aplicación se ira a Pause.
Por otro lado, al poner en marcha el temporizador 2 en el
Resume, la primera vez que entres no está el checkbox activo por lo que el timer2 no se pondrá nunca en marcha a menos que gires la pantalla.
Mírate el ciclo de vida de Android
https://www.b4x.com/android/forum/t...ia-rápida-del-ciclo-de-vida-de-android.38760/
Que seria mas operativo?
- pon un botón de salir, cuando lo pulses pon en marcha o paras el servicio, grabas el estado del check a un fichero y sal de la aplicación. También puedes mirar el evento
Pause y hacerlo allí
- Cuando entres, en
Create, lee el fichero y pon el check como estaba la ultima vez
- en el servicio haz que se vuelva a llamar momentos antes de que se cumpla tu hora de alarma, de esa forma ahorras bateria. Cuando esta se cumpla llamas a main (StartActivity(Main)) , en main en
el
Sub Activity_Create(FirstTime As Boolean) comprueba si la pantalla está bloqueada, desbloqueala y en
Resume llamas a hablar. Emplea la biblioteca
Phone y el evento
TextToSpeechFinish y así sabrás ciertamente cuando tu mensaje de voz finalizó y te ahorras el timer 2 .
Sub Process_Globals
dim EstadoVoz As PhoneEvents
'..........
'..........
'..........
Sub Activity_Create(FirstTime As Boolean)
Dim PhoneId As PhoneId
Dim PE As PhoneEvents
EstadoVoz.InitializeWithPhoneState("PE",PhoneId)
'..........
'..........
'..........
Sub PE_TextToSpeechFinish (Intent As Intent)
' MensajeVozFinalizado
' pon tu codigo
End Sub
Saludos