No tiene nada que ver estar al 100% del tiempo en memoria con el StartAtBoot, StartAtBoot lo único que hace es que cuando reinicies el dispositivo arranque aunque no ejecutes tu APP. Para eso, tienes que hacer llamadas periódicas al servicio que quieras mantener vivo, te aconsejo que vuelvas a leer el turorial de Módulos de servicios: https://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/1. La APP tiene que estar el 100 % del tiempo en memoria... supongo que se hace mediante el servicio Starter con el parámetro " #StartAtBoot: False" en True (pero ALGO MAS ?)
Esto si buscas en el foro encontrará varias veces que lo he respondido. Nuestro amigo Heppy está haciendo un gran trabajo donde recoge los post resueltos y ahí lo encontrarás tambien: https://www.b4x.com/android/forum/threads/indice-temas-con-solucionado-Último-googlemaps-no-me-carga-el-mapa-en-otros-dispositivos.44948/2. Como resolver el tema de las pantallas bloqueadas por PIN o DESLIZADORES, es decir, como deshabilitarlos en el momento en que suene la alarma
3. Es fiable el uso de Timers ? o conviene usar otras librerías ?
Yo sinceramente creí con el titulo que quería programar la alarma del teléfono para no quedarse dormido
Buenos dias Pablo:
Creo que por el bien del foro tendrias que hacer preguntas concretas, por que si no, volvemos a lo de siempre de que nadie viendo el titulo "Consejos para Despertador" va a pensar que quieres saber como se desbloquea una pantalla, como se reinicia un servicio, etc . Erel te diria: Open a new thread
No tiene nada que ver estar al 100% del tiempo en memoria con el StartAtBoot, StartAtBoot lo único que hace es que cuando reinicies el dispositivo arranque aunque no ejecutes tu APP. Para eso, tienes que hacer llamadas periódicas al servicio que quieras mantener vivo, te aconsejo que vuelvas a leer el turorial de Módulos de servicios: https://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/
Esto si buscas en el foro encontrará varias veces que lo he respondido. Nuestro amigo Heppy está haciendo un gran trabajo donde recoge los post resueltos y ahí lo encontrarás tambien: https://www.b4x.com/android/forum/threads/indice-temas-con-solucionado-Último-googlemaps-no-me-carga-el-mapa-en-otros-dispositivos.44948/
El uso de Timers es fiable, pero te aconsejo que leas el tutorial de ciclo de vida: https://www.b4x.com/android/forum/threads/b4a-tutorial-guia-rápida-del-ciclo-de-vida-de-android.38760/ , por que así verás que en cuanto salgas de la aplicación y quede en segundo plano, se pararan, por lo tanto necesitas un servicio en marcha.
Nota: Erel se está volviendo blando, y no te ha echo abrir otro hilo en la misma pregunta que has echo en el foro inglés
Ahh, y las respuestas que te daremos aqui serán mas completas, por que con las que te han dado tendrás que leerte todo el tutorial de módulos de servicios inglés y por poner un ejemplo y sin ganas de menospreciar al compañero que te ha dado la respuesta, responderte: It's about using sticky Services para mantener un servicio, creo que es decir poco si no lees el tutorial, bueno, el te invita a que lo leas. Segundo Ahh , como ya te dije en otro post, no me molesta que hagas la misma pregunta en el foro inglés, pero creo que verás que aqui te tratamos mejor
Saludos
#StartCommandReturnValue: android.app.Service.START_STICKY
Man.. te pones celoso cuando alguien pregunta en el foro en Ingles jajaja... puse consultas muy diferentes.. aquí consejos globales y puntuales y allí solo una duda muy puntual... pero sabes que mi corazón esta aquí.
Acá en Chile es fin de semana largo, fiestas patrias jajaja.. a celebrar, que tengas buen fin de semana.Si me pusiera celoso no te hubiese dado la solucion que le has pedido a Erel
Me voy de finde!!! nos vemos el lunes
Saludos a todos
' MinutesService I put on the nearest alarm
If MinutesService>60 then MinutesService= MinutesService/2
StartServiceAt("", MinutesService*DateTime.TicksPerMinute, True)
Aqui en España cuando se emplea esa expresión de "es un pedazo de código", es para decir que es muy bueno, dudo que en tu pais signifique lo mismoEste es un pedazo de código puesto por ti en el foro en Ingles
Porque no llamarlo 1 hora antes de que deba sonar ?
MinutesService = ExtraigoLaAlarmaMasProximaaLaHoraActual
if MinutesService> 720 then
' 12 horas
MinutesService =720
Else
If MinutesService>60then MinutesService= MinutesService/2
End if
StartServiceAt("", MinutesService*DateTime.TicksPerMinute, True)
Cuando el lapso sea menor a 1 hora..... y en el Service_Start..... debo ahi dar el golpe de gracia y hacer el StartServiceAt ( minutos reales hasta la hora exacta ) ?
MinutesService = ExtraigoLaAlarmaMasProximaaLaHoraActual
' si los minutos son 60 o menos al leerlos.....
MinutesService = 60 ' IMAGINEMOS QUE VALE 60
if MinutesService > 720 then
' NO ENTRARÁ AQUI
' 12 horas
MinutesService = 720
Else
' ENTRARÁ AQUI PERO TAMPOCO CUMPLIRÁ LA CONDICION DE >60
If MinutesService > 60 then MinutesService= MinutesService/2
End if
' CUANDO LLEGUE AQUI NO HABRÁ SIDO MODIFICADO Y VALDRÁ 60 MINUTOS QUE HEMOS PUESTO ARRIBA COMO EJEMPLO
StartServiceAt("", MinutesService * DateTime.TicksPerMinute, True)
Si, ya lo hace ese código que te he pasado:
Pero no te preocupes, será dificil que alcance 60 minutos exactamente, entrará con 45 minutos puesto que va dividiendoB4X:MinutesService = ExtraigoLaAlarmaMasProximaaLaHoraActual ' si los minutos son 60 o menos al leerlos..... MinutesService = 60 ' IMAGINEMOS QUE VALE 60 if MinutesService > 720 then ' NO ENTRARÁ AQUI ' 12 horas MinutesService = 720 Else ' ENTRARÁ AQUI PERO TAMPOCO CUMPLIRÁ LA CONDICION DE >60 If MinutesService > 60 then MinutesService= MinutesService/2 End if ' CUANDO LLEGUE AQUI NO HABRÁ SIDO MODIFICADO Y VALDRÁ 60 MINUTOS QUE HEMOS PUESTO ARRIBA COMO EJEMPLO StartServiceAt("", MinutesService * DateTime.TicksPerMinute, True)
Pon un log antes del StartServiceAt poniendo los minutos y veras la secuencia
Te perdono por que es tu hora de comer
Saludos
Sub ObtenerLenguaje
Dim r As Reflector
r.Target = r.RunStaticMethod("java.util.Locale", "getDefault", Null, Null)
Starter.Lenguaje = r.RunMethod("getLanguage")
Starter.Lenguaje=Starter.Lenguaje.ToUpperCase
End Sub
Sub Service_Start (StartingIntent As Intent)
ProximaHora=99
ActivaHoy=False
ProximoMinuto=99
DiasEsp(1)="Dom"
DiasEsp(2)="Lun"
DiasEsp(3)="Mar"
DiasEsp(4)="Mie"
DiasEsp(5)="Jue"
DiasEsp(6)="Vie"
DiasEsp(7)="Sab"
DiasEng(1)="Sun"
DiasEng(2)="Mon"
DiasEng(3)="Tue"
DiasEng(4)="Wed"
DiasEng(5)="Thu"
DiasEng(6)="Fri"
DiasEng(7)="Sat"
CargoArchivo
End Sub
CancelScheduledService("Alarma")
StartServiceAt("Alarma",xxxxx,true)
Sub SetExactAndAllowWhileIdle (Time As Long, ServiceName As String)
Dim p As Phone
If p.SdkVersion < 23 Then
StartServiceAtExact(ServiceName, Time, True)
Else
Dim in As Intent
in.Initialize("", "")
in.SetComponent(Application.PackageName & "/." & ServiceName.ToLowerCase)
Dim ctxt As JavaObject
ctxt.InitializeContext
Dim am As JavaObject = ctxt.RunMethod("getSystemService", Array("alarm"))
Dim pi As JavaObject
pi = pi.InitializeStatic("android.app.PendingIntent").RunMethod("getService", _
Array(ctxt, 1, in, 134217728))
am.RunMethod("setExactAndAllowWhileIdle", Array(0, Time, pi))
End If
End Sub
Pero supongo que para hacerlo recursivo este código se debe poner en el SERVICE_START verdad ?
' en tu módulo de servicio
Sub Service_Start (StartingIntent As Intent)
MinutesService = ExtraigoLaAlarmaMasProximaaLaHoraActual ' si no hay alarmas (devuelve -1)
' si no hay alarmas (devuelve -1) , destruye el servicio
if MinutesService = -1 then
CancelScheduledService(me) ' Para el StartServiceAt
StopService(me)
Return ' es redundante pero por si Android
End if
if MinutesService> 720 then' 12 horas
MinutesService = 720
Else
If MinutesService>60then MinutesService= MinutesService/2
Endif
StartServiceAt("", MinutesService*DateTime.TicksPerMinute, True)
End Sub
Mírate el código y tu mismo te respondes a esa pregunta que ya es la tercera vezY la pregunta del millon es...
Que pasa si en el bucle final, cuando solo quedan 45 minutos, ocurre que ANDROID cancela tu SERVICE ? se que volverá a recargarse y con este código en el SERVICE_START debería estar resuelto verdad ?
#Region Service Attributes
#StartAtBoot: true
#ExcludeFromDebugger: true
#StartCommandReturnValue: android.app.Service.START_STICKY
Si, yo hago algo similar, aunque la pregunta aqui está fuera de contexto.La APP la estoy haciendo en 2 idiomas, Español e Ingles, y dependerá de lo que la APP lea del movil del usuario con este código
Pero como te digo.. los minutos restantes son recalculados en cada bucle.. o deberían ser recalculado.. por eso yo en SERVICE_START llamaría a recorrer el archivo y redefinir QUE ALARMA es la mas cercana y cual es el lapso de distancia.
algo como
Code:
Sub Service_Start (StartingIntent AsIntent)
ProximaHora=99
ActivaHoy=False
ProximoMinuto=99
DiasEsp(1)="Dom"
DiasEsp(2)="Lun"
DiasEsp(3)="Mar"
DiasEsp(4)="Mie"
DiasEsp(5)="Jue"
DiasEsp(6)="Vie"
DiasEsp(7)="Sab"
DiasEng(1)="Sun"
DiasEng(2)="Mon"
DiasEng(3)="Tue"
DiasEng(4)="Wed"
DiasEng(5)="Thu"
DiasEng(6)="Fri"
DiasEng(7)="Sat"
CargoArchivo
End Sub
En CargoArchivo , me ocupo de leer el archivo de datos, recorrerlo y determinar la próxima alarma. y ahi debería hacer lo siguiente
Code:
CancelScheduledService("Alarma")StartServiceAt("Alarma",xxxxx,true)
Esto mismo debe repetirse desde el ALARM MANAGER , si el usuario modifica, da de alta o pospone una alarma.
StartService(ServicioAlarma)
En Todos los países de adelanta y atrasa 1 hora en verano o Invierno ? No lo creo...
Pero como te digo.. los minutos restantes son recalculados en cada bucle.. o deberían ser recalculado.. por eso yo en SERVICE_START llamaría a recorrer el archivo y redefinir QUE ALARMA es la mas cercana y cual es el lapso de distancia.
' para que se produzca el evento de cambio de horario de verano/invierno o por usuario
DateTime.ListenToExternalTimeChanges
Sub DateTime_TimeChanged()
' hora cambiada (puede ser por horario de verano o por el usuario)
StartServiceAt("", DateTime.Now + 1 * DateTime.TicksPerSecons, True) ' vuelvo a llamar para que recalcule tiempos
End Sub
' en tu módulo de servicio
Sub Service_Start (StartingIntent As Intent)
' para que se produzca el evento de cambio de horario de verano/invierno o por usuario
DateTime.ListenToExternalTimeChanges
' Leo El Fichero con las alarmas y pongo en MinutesService el resultado
MinutesService = ExtraigoLaAlarmaMasProximaaLaHoraActual ' si no hay alarmas (devuelve -1)
' ------------------------------------------------------------
' Calculo si tengo que activar la alarma actual (hacer llamada a un sub que te devuelve True o False)
' ----------------- si estoy en alarma: --------------------
' 1) llamo al activity pertinente que avise de la alarma
' 2) Elimino del fichero la alarma actual
' 3) Vuelvo a calcular la proxima alarma: MinutesService = ExtraigoLaAlarmaMasProximaaLaHoraActual
' ----------------- FIN es alarma: --------------------
' ------------------------------------------------------------
' si no hay alarmas (devuelve -1) , destruye el servicio
if MinutesService = -1 then
CancelScheduledService(me) ' Para el StartServiceAt
StopService(me)
Return ' es redundante pero por si Android
End if
if MinutesService > 720 then ' 12 horas
MinutesService = 720
Else
If MinutesService>60then MinutesService= MinutesService/2
Endif
StartServiceAt("", MinutesService*DateTime.TicksPerMinute, True)
End Sub
Sub DateTime_TimeChanged()
' hora cambiada (puede ser por horario de verano o por el usuario)
StartServiceAt("", DateTime.Now + 1 * DateTime.TicksPerSecons, True) ' vuelvo a llamar para que recalcule tiempos
End Sub
StartService(ServicioAlarma)
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?