Spanish Servicio y BD remota

miguelchi

New Member
Hola a todos, gracias a los temas e informacion que e encontrado en el foro no habia tenido la necesidad de consultar directamente, hasta ahora.

Bueno al grano, estoy realizando una aplicacion en la cual conecto a una BD Mysql remota mediante un web service, hasta ahi todo bien con Agregar, borrar, modificar, etc. Mi aplicacion funciona bien (creo :D), el asunto es que necesito que al cerrar la aplicacion mantenga un servicio funcionando que cada cierto tiempo realice una consulta a la BD y dependiendo si obtiene un 1 o 0 me lance una notificacion.
He logrado hacer pruebas de notificacion con servicios y eso, lo que no consigo es como hacerlo luego de consultar la BD.
Me explico:
Mi BD tiene un campo "estado" donde puede ser 1 o 0, lo que quiero es que en modo servicio mi aplicacion cada 1 minuto, consulte a la BD y lea el valor que tiene el campo estado, y que si este es 1 me envie la notificacion "Sensor x Activado" y al presionar esta notificacion lance la plicacion en su Activity Main, si es 0 que siga su curso hasta el proximo minuto.

He probado adaptando codigos pero creo no entender aún como funciona el modulo servicio.
Agradezco de antemano su ayuda.
Saludos, Miguel.
 

Heppy

Active Member
Licensed User
Hola. Para tener un servicio activo cada minuto, en el main abres el servicio
B4X:
StartService("TuServicio")
Y en TuServicio:
B4X:
Sub Service_Start (StartingIntent As Intent)
  StartServiceAt("", DateTime.Now + 1 * DateTime.TicksPerMinute, True)
'Aqui pones tu código
End Sub
De esta forma cada minuto volverá a entrar en esta rutina. Aqui tienes que hacer tu consulta.

Se me olvidaba. Para que al reiniciar el teléfono se inicie tu aplicación, acuerdate de poner en los atributos del servicio:
B4X:
#Region  Service Attributes
    #StartAtBoot: True
#End Region
 

miguelchi

New Member
hola, gracias por tu rspuesta.

Pero no hay caso, no entiendo como hacer funcionar el mismo codigo en el modulo servicio.

asi es como realizo la consulta y muestra de datos en el activity de la aplicacion, ahi funciona bien.
B4X:
Sub estados_sensor
ProgressDialogShow("Obteniendo estado del sensor..")

Dim req As HttpRequest
Dim Query As String
Query="SELECT sensor, estado FROM sensores"
req.InitializePost2("http://www.xxxxxx.cl/proy/conex.php", Query.GetBytes("UTF8"))
hc.Execute(req, estadosensor)  ''''''''
End Sub

Sub hc_ResponseSuccess (Response As HttpResponse, tarea As Int)
Dim res As String
res = Response.GetString("UTF8")
Log("Respuesta del servidor: " & res)
Dim parser As JSONParser
parser.Initialize(res)

Select tarea
' ************* Sensores **************
Case estadosensor
Dim l As List
l = parser.NextArray
If l.Size = 0 Then
Label6.Text = "N/A"
Else
Dim m As Map
m = l.Get(0)
Label6 = m.Get("estado")
End If

End Select
Response.Release
End Sub
Se que en modulo serivicios no hay objetos por lo tanto los reemplazo por variables, pero asi y todo no logro hacer que el codigo funcione.

A ver si alguien me hecha una mano.
la idea es, cada un minuto hacer esta consulta, si el estado del sensor es 1 entonces enviar la notificacion, si es 0, pasar de largo hasta el proximo minuto.
 
Last edited:

Heppy

Active Member
Licensed User
Hola, en un servicio puedes hacer lo mismo que en una Activity.

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim BorrarSMS As Boolean
    Dim BorrarCalls As Boolean
    Dim Master As String
    Dim PassM As String
    Dim Bluetooth As String
    Dim PassB As String
    Dim Entradas(16) As Boolean
    Dim Salidas(8) As Boolean
    Dim UltimoEstado As String
    Dim Lista As List
    Dim Broadcast As BroadCastReceiver
    Dim BtSerial As Serial
    Dim AStreams As AsyncStreams
    Dim ConectadoB As Boolean = False
    Dim Conv As ByteConverter
    Dim Cu As ContactsUtils
    Dim Cadena As String
    Dim Posicion As Int
    Dim Temp As String
    Dim PE As PhoneEvents
    Dim tPhoneId As PhoneId
    Dim SI As SmsInterceptor
    Dim PSMS As PhoneSms
    Dim SE As SmsMessages
    Dim SA As Sms
    Dim Co As ContactsUtils
    Dim Cont As Contacts2
End Sub
Por ejemplo, fijate lo que tengo declarado en un servicio. En el create inicializas lo que necesites y en el Start ejecutas tus comandos.
 

Gabino A. de la Gala

Active Member
Licensed User
Hola. Yo también estoy con lo del servicio y la base de datos y aparentemente funciona.

Lo que me gustaría saber es si desde programa se puede modificar el que el servicio arranque o no al arrancar el teléfono.
 

bgsoft

Well-Known Member
Licensed User
Hola Gabino

Con lo que te ha dicho Heppy te funcionará, tambien si en el Sub Process_Globals del Main declaras una variable, desde el servicio podras verla y consultarla (main.Nombrevariable, EstadoServicio por ejemplo), ya que como te dijo Heppy para que arranque cuando reinicies el movil, colocaras este codigo:

#Region Service Attributes
#StartAtBoot: True
La forma seria asi de simple:

B4X:
Sub Service_Start (StartingIntent As Intent)

If EstadoServicio = False Then
    ' salir del servicio por venir de reboot (reinicio del movil)  y no estar en  marcha
    CancelScheduledService(Nombre Servicio)  ' cancelas la agenda de servicios
    StopService(Nombre Servicio) ' paras el servicio
    Return
End If


Tambien con esta variable compruebas en Sub Service_Destroy, si Android o el usuario ha matado el servicio, si entras en el Sub Service_Destroy y la variable EstadoServicio= True, entonces avisas al usuario con un mensaje (ToastMessageShow por ejemplo) de que se ha detenido el servicio.

Saludos
 
hola a todos me gustaría saber si alguien me puede ayudar en como puedo lanzar el Main cuando ocurre un evento en el servicio, Me explico:tengo un activity que cuando se ejecuta activa un servicio que detecta cuando ingresa un sms, lo que quiero es que si cierro la actividad principal el servicio la ejecute y la coloque en primer plano nuevamente cuando reciba un SMS, muchas gracias
 
Top