Spanish Problema con servicio

nicomx

Member
Licensed User
Buenas tardes, una vez mas me atasco...

Esta vez con los servicios. Necesito ejecutar un servicio que mande una mail a determinadas horas, el solito, por lo que tengo que crear una rutina desde la cual haga todo el trabajo cuando el servicio llega a la hora programada...

El servicio funciona, salta cuando arranco la app (ya veremos a ver como evito esto) pero el problema es que cuando llega a la hora fijada y tiene que cargar el sub que hace el trabajo se muere la app y me tira errores.

Aquí la pregunta... ¿ el propio servicio puede hacer el trabajo ?, o quizá un modulo de código aparte llamado desde el servicio.

Lo que tiene que hacer básicamente es verificar un archivo o varios (esto lo tengo claro) y mandarlo como adjunto en un mail a una dirección concreta... vamos que si existe el archivo lo manda y después lo elimina, renombra, mueve... (ya veremos).

Un saludo a tod@s.

Eugenio J. Sánchez
 

bgsoft

Well-Known Member
Licensed User
Hola

Sin ver algo de código es dificil ayudarte, en los servicios puedes meter el código que quieras menos objetos, ya que los objetos pertenecen a los formularios, aunque si los necesitas haces un CallSubDelayed al formulario.

El servicio funciona, salta cuando arranco la app (ya veremos a ver como evito esto
Creo que estas empleando el servicio Starter y por eso dices lo de evitar que se active, mucha gente tiene problemas con ese servicio dependiendo del código, asi que si te pasa lo mismo eliminalo y crea un servicio con otro nombre.
Aqui expliqué el ciclo de vida con ese servicio: https://www.b4x.com/android/forum/t...-el-módulo-de-servicio-starter.66596/#content , seria interesenta que lo miraras para entender que pasa al arrancar una App

Aqui puedes mirar un pequeño tutorial sobre módulos de servicios si ya no lo miraste:
https://www.b4x.com/android/forum/threads/b4a-tutorial-módulos-de-servicio.42689/

Saludos
 

nicomx

Member
Licensed User
Buenas tardes y, una vez mas, muchas gracias por tus respuestas.

Al final parece que esto va tomando color, he visto varios códigos y los he adoptado para el fin que busco y parece que, a nivel notificación, va funcionando.

He puesto este trocito de código en el punto que quiero que se llame al modulo de código que ha de comparar las condiciones

B4X:
    CancelScheduledService(autoreport)
    report_service.time_verif

Luego en el modulo he utilizado este código:

B4X:
Sub time_verif
    
    Dim t As Long = FindNextTime(Array As Double(15.5,23.5))
        CancelScheduledService(autoreport)
        StartServiceAt(autoreport,t,True)
   


End Sub
   
public Sub FindNextTime(Times As List) As Long
    Times.Sort(True)
    For Each st As Double In Times
        If SetHours(st) > DateTime.Now Then
            Return SetHours(st)
        End If
    Next
    Return DateTime.Add(SetHours(Times.Get(0)), 0, 0, 1)
End Sub

public Sub SetHours(st As Double) As Long
    Dim hours As Int = Floor(st)
    Dim minutes As Int = 60 * (st - hours)
    Return DateUtils.SetDateAndTime(DateTime.GetYear(DateTime.Now), _
       DateTime.GetMonth(DateTime.Now), DateTime.GetDayOfMonth(DateTime.Now), hours, minutes, 0)
End Sub

Y finalmente en el servicio este otro (creo que es el mismo del modulo, bueno casi)

B4X:
#Region Service Attributes
    #StartAtBoot: false
    #StartCommandReturnValue: android.app.Service.START_STICKY
#End Region

Sub Process_Globals
End Sub

Sub service_create   
End Sub

Sub Service_Start (StartingIntent As Intent)

    Dim t As Long = FindNextTime(Array As Double(23.5,15.5))
    StartServiceAt(Me,t,True)

    Dim notif As Notification
    notif.Initialize
    notif.AutoCancel=True
    notif.icon ="icon"
    notif.SetInfo("Informe - Report","Enviando report del " & DateTime.date(DateTime.Now),Main)
    notif.Notify(1)
ToastMessageShow("Enviando archivo...",True)
    StopService("")

End Sub

Sub Service_Destroy
    
End Sub

public Sub FindNextTime(Times As List) As Long
    Times.Sort(True)
    For Each st As Double In Times
        If SetHours(st) > DateTime.Now Then
            Return SetHours(st)
        End If
    Next
    Return DateTime.Add(SetHours(Times.Get(0)), 0, 0, 1)
End Sub

public Sub SetHours(st As Double) As Long
    Dim hours As Int = Floor(st)
    Dim minutes As Int = 60 * (st - hours)
    Return DateUtils.SetDateAndTime(DateTime.GetYear(DateTime.Now), _
       DateTime.GetMonth(DateTime.Now), DateTime.GetDayOfMonth(DateTime.Now), hours, minutes, 0)
End Sub
Y de momento la notificación salta cuando toca, osea, a las 15:30 de la tarde y a las 23:30

Se que no es solución el copiar y pegar código, pero lo que si es cierto es que después de muchas pruebas, es lo único que me ha funcionado como yo quería.

Solo queda añadir el código que maneja los archivos y probarlo... a ver que tal

Estoy absolutamente convencido de que todo esto se puede mejorar, reducir y depurar, aunque no tengo muy claro el como. Lo que si tengo claro es que de momento funciona bien.

Probare el resto (tratamiento de los archivos y rutina del mail) y volveré a comentar si funciona o no..

Un saludo y gracias de nuevo.

Eugenio J. Sánchez
 
Top