Spanish PROGRAMA RESIDENTE EN MEMORIA

felixjavierdiaz

Member
Licensed User
Longtime User
Hola a todos...

Alguien me puede orientar como puedo realizar un programa que este residente en memoria (como un servicio) y que este permanentemente en ejecución.

Necesito crear uno que active el GPS de manera permanente y este enviando los datos de la ubicación a un servidor.

Gracias,

fdm
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

La mejor forma de hacerlo para que el Sistema Operativo no te mate la aplicacion es creando el código en un servicio.

Crea un modulo de servicio en : Project/Add New Module/Service Module

Para llamarlo desde el aplicativo lo puedes hacer asi:

B4X:
StartService(NombredelServicio)


Si solo quieres que funcione el servicio , despues de llamarlo puedes finalizar la aplicación (no te preocupes que el servicio seguirá en marcha) :

B4X:
StartService(NombredelServicio)
Activity.Finish

En Sub Process_Globals , crea las variables que te interese

En Sub Service_Create , inicializa las variables, "teoricamente" solo entrará aqui cuando crees el servicio, y digo teoricamente por que el Sistema Operativo podria matar el servicio y volver a entrar en el como si fuera la primera vez (lo digo por experiencia :D)

En Sub Service_Start (StartingIntent As Intent) , haz lo que quieras hacer de tu programa, y al final, para que vuelva a llamar al servicio puedes hacerlo asi

B4X:
Sub Service_Start (StartingIntent As Intent)

' escribe tu codigo aqui
' ............
' ............
' ............

' Esto llama al servicio cada x minutos (los que pongas en NumerodeMinutos)
StartServiceAt("", DateTime.Now + NumerodeMinutos * DateTime.TicksPerMinute, True)

' si minutos es mucho tiempo, puedes llamarlo cada x segundos (NumerodeSegundos)
StartServiceAt("", DateTime.Now + NumerodeSegundos * DateTime.TicksPerSecond, True)

End Sub

Para parar el servicio desde tu aplicación si está en marcha, puedes hacerlo así:

B4X:
' Si IsPaused = True, el servicio está parado
If IsPaused(NombredelServicio) = False Then  ' Si el servicio está en marcha. 
    CancelScheduledService(NombredelServicio)  ' Para el  StartServiceAt
    StopService(NombredelServicio)
end If


En Sub Service_Destroy , entrará cuando el servicio lo elimine el Sistema Operativo, o tu desde el Administrador de Aplicaciones.

Si quieres un consejo, pon LOG en todos esos Sub y asi sabrás como se comporta.

Saludos
 

josete

Member
Licensed User
Longtime User
Resucito este post ya que quiero hacerme mi propia aplicacion de control de llamadas y sms para contrastar con las facturas del movil...En la aplicacion mostrare los datos en lo que va de mes que ire guardando en una base de datos local y en otro layout un historico para consultar datos de otros meses o dias.Al grano,entiendo que la aplicacion solo deberia funcionar cuando quiera consultar algo,pero la parte que registra los datos cada vez que se haga una llamada o se mande un sms debera funcionar mientras lo haga el telefono,entonces como dice Bgsoft arriba,lo correcto seria iniciar la aplicacion automaticamente al encender el movil,que la aplicacion inicie el servicio y acto seguido finalizar la aplicacion?
 

dar2o3

Active Member
Licensed User
Longtime User
Creo que no, lo mejor es crear el servicio en un proyecto aparte, crear sólo el servicio, existe la opción de que se ponga en marcha al arrancar el sistema operativo automáticamente, este que se encargue de guardar los datos en la bd y en otro proyecto aparte haría la pantalla de consulta de la bd.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Josete

Tu no le dices al sistema que inicialice la aplicación, si no que inicialice el servicio, asi que en tu aplicacion creas un servicio, y en este pones esto:

B4X:
#Region  Service Attributes
#StartAtBoot: true

El #Region Service Attributes está arriba del todo del servicio

Si miras mi ejemplo del principio, explica como saber si el servicio está en marcha, como ponerlo en marcha y como pararlo, asi que con eso puedes jugar para que el programa haga lo que tu quieras mientras el usuario lo utilice o salga de la aplicación.

Por otro lado, como he explicado en otros Post, Android incluso puede matar un servicio dependiendo de la necesidad de liberar memoria, que el usuario borre la RAM, etc. Entonces para asegurarte que lo volverá a ejecurar, pon esto:

B4X:
#StartCommandReturnValue: android.app.Service.START_STICKY


Tambien va en #Region Service Attributes

Por otro lado, create una variable global, y cuando tu quieras matar el servicio, en Sub Service_Destroy la consultas y actua en consecuencia.


Saludos
 
Last edited:
Top