Italian service o no service ...questo è il problema.

fifiddu70

Well-Known Member
Licensed User
Longtime User
Ciao a tutti, ritorno con il problema, la mia app deve svolgere il monitoraggio in background di numeri inviati ad un host del mio sito web, ogni 3 secondi interroga il sito web visualizzando il numero in quel momento inviato, non appena questo numero corrisponde con il numero memorizzato nell'app, questa dovrebbe svegliarsi dal background e suonare avvisando anche del numero corrispondente, tutto funziona perfettamente anche ij background, ma dopo un po sembra non essere più attiva come se fosse uccisa, eppure la notifica rimane sempre presente sul telefono, dove sbaglio e sopratutto come faccio ad avere l'app sempre sveglia in background, vi posto il modulo service per capiere se sbaglio qualcosa.

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

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
   
   
    Dim N As Notification
    Dim hc As     OkHttpClient
    Dim testo As String
    Dim timer1 As Timer
    Dim timer2 As Timer
    Dim timer3 As Timer
    Dim timer4 As Timer
    Dim risultatoA As String
    Dim risultatoB As String
    Dim risultatoC As String
    Dim risultatoD As String
   
End Sub

Sub Service_Create
    n.Initialize
    n.Icon = "icon"
    n.Sound = False
    n.Vibrate = False
    n.Light = False
    n.OnGoingEvent=True
    n.SetInfo("Turn And Go","Numero prenotato " &  Main.chiamataA & " " & Main.chiamataB & " " & Main.chiamataC & " " & Main.chiamataD ,Main)
    n.Notify(1)


    hc.Initialize("hc")
    timer1.Initialize("timer1",3000)
    timer2.Initialize("timer2",3000)
    timer3.Initialize("timer3",3000)
    timer4.Initialize("timer4",3000)
   
    timer1.Enabled=True
    timer2.Enabled=True
    timer3.Enabled=True
    timer4.Enabled=True
   
   
End Sub

Sub Service_Start (StartingIntent As Intent)
   
    Service.StartForeground(1,n)  
    StartServiceAt(Me, DateTime.Now + 30 * DateTime.TicksPerMinute, True)
    risultatoA = Main.chiamataA
    risultatoB = Main.chiamataB
    risultatoC = Main.chiamataC
    risultatoD = Main.chiamataD

End Sub




Sub timer1_Tick
    Log("sono sulla sub timer1 di Starter")
    Dim job As HttpJob
    job.Initialize("Job", Me)
    job.Download("http://www.xxxxx.xxx/xxxxxx/"& Main.linea & "/NumeroA.txt")
   
End Sub

Sub timer2_Tick
    Log("sono sulla sub timer2 di Starter")
    Dim job As HttpJob
    job.Initialize("Job", Me)
    job.Download("http://www.xxxxx.xxx/xxxxxx/"& Main.linea & "/NumeroB.txt")
       
End Sub

Sub timer3_Tick
    Log("sono sulla sub timer3")
    Dim job As HttpJob
    job.Initialize("Job", Me)
    job.Download("http://www.xxxxx.xxx/xxxxxx/"& Main.linea & "/NumeroC.txt")
       
End Sub

Sub timer4_Tick
    Log("sono sulla sub timer4")
    Dim job As HttpJob
    job.Initialize("Job", Me)
    job.Download("http://www.xxxxx.xxx/xxxxxx/"& Main.linea & "/NumeroD.txt")
       
End Sub
Sub JobDone (job As HttpJob)
   
    Log("JobName = " & job.JobName & ", Success = " & job.Success)
    If job.Success = True Then
        Select job.JobName
            Case "Job" , "job2"
                'print the result to the logs
               
                testo =job.GetString
                Log(job.GetString)
                If testo.StartsWith("A") Then
                   
                    Log("su starter nel job " & risultatoA)
                    If  job.GetString = risultatoA  Then
                        Log("minchiaaaaa")
                       
                        StartActivity(avviso)
                       
                    End If
                else if testo.StartsWith("B") Then
                   
                    If  job.GetString = risultatoB  Then
                        Log("minchiaaaaa")
                       
                        StartActivity(avviso)
                    End If
                   
                else if testo.StartsWith("C") Then
                   
                    If  job.GetString = risultatoC  Then
                        Log("minchiaaaaa")
                       
                        StartActivity(avviso)
                    End If
                   
                else if testo.StartsWith("D") Then
                   
                    If  job.GetString = risultatoD  Then
                        Log("minchiaaaaa")
                       
                        StartActivity(avviso)
                    End If
                End If
       
            Case "Job3"
                'show the downloaded image
                'Activity.SetBackgroundImage(job.GetBitmap)
        End Select
    Else
        Log("Error: " & job.ErrorMessage)
        'ToastMessageShow("Error: " & job.ErrorMessage, True)
    End If
    job.Release
   
End Sub
Sub testo_TextChanged (Old As String, New As String)
    If testo = Old Then
       
    Else
        Log("vai sulla sub Creafile")
    End If
End Sub
Sub Service_Destroy
    n.Cancel(1)
End Sub

perchè non rimane attivo come mai non si sveglia dopo qualche ora in backgr più appena il numero ricevuto e 0 al numero prenotato?
 
Last edited:

MarcoRome

Expert
Licensed User
Longtime User
Aggiungi al codice che hai:

B4X:
Sub Process_Globals
       .....
       Private lock As PhoneWakeState
End Sub

Sub Service_Create
    ....
    lock.PartialLock
End Sub

Sub Service_Destroy
    lock.ReleasePartialLock
End Sub
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Adesso provo a fare come dici te MarcoRome, ti faccio sapere stasera, in tal caso potresti aiutarmi? la mia mail: [email protected] lasciami il tuo numero di whatsapp se non disturbo.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
appena lo installato esce subito dall'app e va in background, ma questo non mi permette di inserire il numero di prenotazione prima che vada in background, devo essere io a mandarlo in background.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
secondo me il codice ha qualche problema

Innanzitutto non ti serve settare il service come STICKY (come ti avevo suggerito io) poichè utilizzando la "Notification" il service ti dovrebbe rimanere sempre attivo.

Poi non ho capito cosa ti servono 4 timer visto che devi comunque fare una chiamata ogni 3 secondi, in realtà te ne basterebbe uno solo, infatti un altro problema che hai è che fai partire tutti e 4 i timer contemporaneamente, e quindi vengono eseguite 4 chiamate job.Download contemporaneamente, per cui su JobDone secondo me avviene un bel macello.

Sui moduli service è sbagliato usare il timer, in realtà dovresti eseguire la procedura che ti serve (cioè i 4 job.Download utilizzando il Wait For), visualizzare il risultato a video (e fare tutto quello che ti serve), leggere l'orologio di sistema, aggiungere 3 secondi, ed utilizzare StartServiceAt per richiamare il Service dopo 3 secondi.

Sergio
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Sergio, non ho molta esperienza sul service, pensavo che i timer ne servivano 4 per visualizzare i 4 numeri differenti tra loro per lettera, in pratica sto realizzando un eliminacode a 4 utenze, A - B - C - D e relativi numeri di chiamata, ad esempio...A1 ....A2 etc, potresti farmi capire in che modo devo modificare il mio codice? mi manca solo risolvere questo problema del modulo service per terminare la mia app.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Allora....dopo tentativi sembra che ieri sia successo un problema inspiegabile all'app, intanto non capisco perchè tutte le istruzioni if non le faceva correttamente, non so se vi e mai capitato, ad esempio gli dicevo di creare un file di testo se nella directory non era esistente e quindi: if file.exist(file.dirinternal,"view.txt") = false then etc....
praticamente non eseguiva le istruzioni if in modo coretto, se vi e successo ditemi come mai e se avete trovato la causa, comunque con l'aggiunta del codice di MarcoRome:
Private lock As PhoneWakeState sembra rimanere ore sempre in attesa di risposta dal sito web, quindi speriamo bene che funzioni anche negli altri telefoni, per quanto riguarda l'uso di 4 timer, se ne faccio uso di uno solo praticamente mi esegue solo il download della lettera D ecco perchè avevo optato per 4 timer ognuno per ogni lettera,
rimane solamente una domanda...dopo che si sveglia e riappare l'activity con il pulsante per chiudere definitivamente vorrei che l'app non partisse dinuovo fino a quando non decido io facendo click su di essa, invece dopo qualche minuto si riapre sempre rimanendo l'icona di notifica in primo piano, mi sembra troppo invadente, c'è un modo per uccidere l'app senza causare probelmi al suo funzionamento quando invece non deve essere uccisa?
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
a proposito questo è il codice del modulo service che sembra funzionare tranne che si riapre dopo qualche minuto con icona di notifica.
B4X:
#Region  Service Attributes
  #StartAtBoot: True
  #End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
   
    Private lock As PhoneWakeState
    Dim N As Notification
    Dim hc As     OkHttpClient
    Dim testo As String
    Dim timer1 As Timer
    Dim timer2 As Timer
    Dim timer3 As Timer
    Dim timer4 As Timer
    Dim risultatoA As String
    Dim risultatoB As String
    Dim risultatoC As String
    Dim risultatoD As String
   
End Sub

Sub Service_Create
    n.Initialize
    n.Icon = "icon"
    n.Sound = False
    n.Vibrate = False
    n.Light = False
    n.OnGoingEvent=True
    n.SetInfo("","Numero prenotato " &  Main.chiamataA & " " & Main.chiamataB & " " & Main.chiamataC & " " & Main.chiamataD ,Main)
    n.Notify(1)
    lock.PartialLock

    hc.Initialize("hc")
    timer1.Initialize("timer1",3000)
    timer2.Initialize("timer2",3000)
    timer3.Initialize("timer3",3000)
    timer4.Initialize("timer4",3000)
   
    timer1.Enabled=True
    timer2.Enabled=True
    timer3.Enabled=True
    timer4.Enabled=True
   
   
End Sub

Sub Service_Start (StartingIntent As Intent)
   
    Service.StartForeground(1,n)  
    StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True)
    risultatoA = Main.chiamataA
    risultatoB = Main.chiamataB
    risultatoC = Main.chiamataC
    risultatoD = Main.chiamataD

End Sub




Sub timer1_Tick
    Log("sono sulla sub timer1 di Starter")
    Dim job As HttpJob
    job.Initialize("Job", Me)
    job.Download("http://www.xxxxxx.xxxx/xxxxxx/"& Main.linea & "/NumeroA.txt")
   
End Sub

Sub timer2_Tick
    Log("sono sulla sub timer2 di Starter")
    Dim job As HttpJob
    job.Initialize("Job", Me)
    job.Download("http://www.xxxxxx.xxxx/xxxxxx/"& Main.linea & "/NumeroB.txt")
       
End Sub

Sub timer3_Tick
    Log("sono sulla sub timer3")
    Dim job As HttpJob
    job.Initialize("Job", Me)
   job.Download("http://www.xxxxxx.xxxx/xxxxxx/"& Main.linea & "/NumeroC.txt")
       
End Sub

Sub timer4_Tick
    Log("sono sulla sub timer4")
    Dim job As HttpJob
    job.Initialize("Job", Me)
   job.Download("http://www.xxxxxx.xxxx/xxxxxx/"& Main.linea & "/NumeroD.txt")
       
End Sub
Sub JobDone (job As HttpJob)
   
    Log("JobName = " & job.JobName & ", Success = " & job.Success)
    If job.Success = True Then
        Select job.JobName
            Case "Job" , "job2"
                'print the result to the logs
               
                testo =job.GetString
                Log(job.GetString)
                If testo.StartsWith("A") Then
                   
                    Log("su starter nel job " & risultatoA)
                    If  job.GetString = risultatoA  Then
                        Log("sveglio l'app con il numero A...")
                       
                        StartActivity(avviso)
                       
                    End If
                else if testo.StartsWith("B") Then
                   
                    If  job.GetString = risultatoB  Then
                       Log("sveglio l'app con il numero B...")
                       
                        StartActivity(avviso)
                    End If
                   
                else if testo.StartsWith("C") Then
                   
                    If  job.GetString = risultatoC  Then
                       Log("sveglio l'app con il numero C...")
                       
                        StartActivity(avviso)
                    End If
                   
                else if testo.StartsWith("D") Then
                   
                    If  job.GetString = risultatoD  Then
                        Log("sveglio l'app con il numero D...")
                       
                        StartActivity(avviso)
                    End If
                End If
       
            Case "Job3"
              
       End Select
    Else
        Log("Error: " & job.ErrorMessage)
      
    End If
    job.Release
   
End Sub
Sub testo_TextChanged (Old As String, New As String)
    If testo = Old Then
       
    Else
        Log("vai sulla sub Creafile")
    End If
End Sub
Sub Service_Destroy
    lock.ReleasePartialLock
    n.Cancel(1)
End Sub

secondo voi se imposto a False il #StartAtBoot: True
poi l'app si sveglia invece quando mi serve che non sia uccisa?
oppure e colpa di: StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True)
insomma ora che sembra che funzioni non vorrei creare scompiglio per poi ritornare ad avere brutte sorprese.
 

MarcoRome

Expert
Licensed User
Longtime User
Ti si riapre perchè:

Se inserisci
B4X:
#StartAtBoot: True
1. Il servizio sarà attivato nel momento in cui accendi il dispositivo ( che tu abbia eseguito o meno l'app )

2. Con l'istruzione
B4X:
StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True)
Il servizio verrà eseguito ogni 10 minuti

Quindi io la posto tuo eliminerei il punto 1 e quando l'utente decide di uscire dall'app devi cancellare la schedulazione del Servizio che parte con StartServiceAt con
B4X:
CancelScheduledService(NomeServizio)
 
Last edited:

fifiddu70

Well-Known Member
Licensed User
Longtime User
perfetto, adesso mi metto al lavoro e vediamo se funziona, grazie MarcoRome, ti faccio sapere.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Allora....dopo tentativi sembra che ieri sia successo un problema inspiegabile all'app, intanto non capisco perchè tutte le istruzioni if non le faceva correttamente, non so se vi e mai capitato, ad esempio gli dicevo di creare un file di testo se nella directory non era esistente e quindi: if file.exist(file.dirinternal,"view.txt") = false then etc....
praticamente non eseguiva le istruzioni if in modo coretto, se vi e successo ditemi come mai e se avete trovato la causa, comunque con l'aggiunta del codice di MarcoRome:
Private lock As PhoneWakeState sembra rimanere ore sempre in attesa di risposta dal sito web, quindi speriamo bene che funzioni anche negli altri telefoni, per quanto riguarda l'uso di 4 timer, se ne faccio uso di uno solo praticamente mi esegue solo il download della lettera D ecco perchè avevo optato per 4 timer ognuno per ogni lettera,
rimane solamente una domanda...dopo che si sveglia e riappare l'activity con il pulsante per chiudere definitivamente vorrei che l'app non partisse dinuovo fino a quando non decido io facendo click su di essa, invece dopo qualche minuto si riapre sempre rimanendo l'icona di notifica in primo piano, mi sembra troppo invadente, c'è un modo per uccidere l'app senza causare probelmi al suo funzionamento quando invece non deve essere uccisa?

io ti ho detto quale è il problema, ti ho detto anche come risolverlo, ma se tu non fai le modifiche al programma è ovvio che ti dia quei problemi, come è ora strutturato il programma è normale che l'IF non funzioni, ed è normale che ti scarichi solo la lettera D, non mi sarei aspettato niente di diverso.
Hai messo il Wait For che ti avevo detto ???

Riassumendo:
1) non devi usare il timer ma un StartServiceAt
2) dentro l'evento del service chiami job.Download per la lettera A, aspetti che ti risponda con il WaitFor e analizzi la risposta. Poi fai job.Download per la lettera B, aspetti la risposta con il WaitFor eccetera eccetera fino alla lettera D
3) richiami il StartServiceAt per rifare il tutto dopo 3 secondi

Sergio
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
sirjo66 intanto grazie per la risposta perchè credo che sia importante per tutti avere aiuto, solo che non ho capito come strutturarlo al livello di codice, vediamo se ci riesco con questo mio esempio, ho tolto i timer ed impostato secondo la mia ignoranza in questo modo, ma non funziona, se lo inserisco dentro il service create oppure il service start praticamente ricevo errori nei wait for

B4X:
#Region  Service Attributes
    #StartAtBoot: False
  
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
  
    Private lock As PhoneWakeState
    Dim N As Notification
    Dim hc As     OkHttpClient
    Dim testo As String
    Dim risultatoA As String
    Dim risultatoB As String
    Dim risultatoC As String
    Dim risultatoD As String
  
End Sub

Sub Service_Create
    n.Initialize
    n.Icon = "icon"
    n.Sound = False
    n.Vibrate = False
    n.Light = False
    n.OnGoingEvent=True
    n.SetInfo("Turn And Go","Numero prenotato " &  Main.chiamataA & " " & Main.chiamataB & " " & Main.chiamataC & " " & Main.chiamataD ,Main)
    n.Notify(1)
    lock.PartialLock
    hc.Initialize("hc")
  
  
End Sub

Sub Service_Start (StartingIntent As Intent)
  
    Service.StartForeground(1,n) 
    StartServiceAt(Me, DateTime.Now + 3* DateTime.TicksPerSeconds, True)
  
    risultatoA = Main.chiamataA
    risultatoB = Main.chiamataB
    risultatoC = Main.chiamataC
    risultatoD = Main.chiamataD
Dim job As HttpJob
    job.Initialize("Job", Me)
    job.Download("http://www.xxxxxxx.xxxx/xxxxx/"& Main.linea & "/NumeroA.txt")
    wait for
    job.Download("http://www.xxxxxxx.xxxx/xxxxx/"& Main.linea & "/NumeroB.txt")
    wait for
    job.Download("http://www.xxxxxxx.xxxx/xxxxx/"& Main.linea & "/NumeroC.txt")
    wait for
    job.Download("http://www.xxxxxxx.xxxx/xxxxx/"& Main.linea & "/NumeroD.txt")
End Sub



   

Sub JobDone (job As HttpJob)
  
    Log("JobName = " & job.JobName & ", Success = " & job.Success)
    If job.Success = True Then
        Select job.JobName
            Case "Job" , "job2"
                'print the result to the logs
              
                testo =job.GetString
                Log(job.GetString)
                If testo.StartsWith("A") Then
                  
                    Log("su starter nel job " & risultatoA)
                    If  job.GetString = risultatoA  Then
                      
                      
                        StartActivity(avviso)
                      
                    End If
                else if testo.StartsWith("B") Then
                  
                    If  job.GetString = risultatoB  Then
                      
                      
                        StartActivity(avviso)
                    End If
                  
                else if testo.StartsWith("C") Then
                  
                    If  job.GetString = risultatoC  Then
                      
                      
                        StartActivity(avviso)
                    End If
                  
                else if testo.StartsWith("D") Then
                  
                    If  job.GetString = risultatoD  Then
                      
                      
                        StartActivity(avviso)
                    End If
                End If
      
            Case "Job3"
               

        End Select
    Else
        Log("Error: " & job.ErrorMessage)
     
    End If
    job.Release
  
End Sub
Sub testo_TextChanged (Old As String, New As String)
    If testo = Old Then
      
    Else
        Log("vai sulla sub Creafile")
    End If
End Sub
Sub Service_Destroy
    lock.ReleasePartialLock
    n.Cancel(1)
End Sub

come strutturare il tutto come dici tu srjo66?
 

sirjo66

Well-Known Member
Licensed User
Longtime User
ahi ahi, qui bisogna darti proprio la pappa pronta, non hai fatto una ricerca per vedere come si usa il Wait For ??

Innanzitutto tutta la Sub JobDone devi toglierla (o almeno, per ora, cambiagli nome), e il controllo se quello ricevuto è tale da far avvisare il cliente lo dovrai fare appena dopo il Wait For

ad esempio:
B4X:
Dim job As HttpJob
job.Initialize("", Me)
job.Download("http://www.xxxxxxx.xxxx/xxxxx/"& Main.linea & "/NumeroA.txt")
Wait For (job) JobDone(job As HttpJob)
If job.Success Then
   Dim testo As String = job.GetString
   Log(testo)
   ........ qui adesso fai tutti i controlli che ti servono
End If
job.Release

... e qui ricominci con ....
Dim job As HttpJob
...... e fai la lettera B

e comunque questo codice non va messo su Service_Create ma su Service_Start
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
lo provo subito sirjo66 :) in effetti non ho visto come funziona il wait for, sorry.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
sirjo66 purtroppo il codice non viene eseguito ogni 3 secondi, dove sbaglio? questo il modulo service ricompilato come nuovo:
B4X:
#Region  Service Attributes
    #StartAtBoot: False
   
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    
    Private lock As PhoneWakeState
    Dim N As Notification
    Dim hc As     OkHttpClient
    Dim testo As String
    Dim risultatoA As String
    Dim risultatoB As String
    Dim risultatoC As String
    Dim risultatoD As String
    
End Sub

Sub Service_Create
    n.Initialize
    n.Icon = "icon"
    n.Sound = False
    n.Vibrate = False
    n.Light = False
    n.OnGoingEvent=True
    n.SetInfo("Turn And Go","Numero prenotato " &  Main.chiamataA & " " & Main.chiamataB & " " & Main.chiamataC & " " & Main.chiamataD ,Main)
    n.Notify(1)
    lock.PartialLock   
    hc.Initialize("hc")
        
End Sub

Sub Service_Start (StartingIntent As Intent)
    
    Service.StartForeground(1,n)   
    StartServiceAt(Me, DateTime.Now + 3 * DateTime.TicksPerSecond, True)
    risultatoA = Main.chiamataA
    risultatoB = Main.chiamataB
    risultatoC = Main.chiamataC
    risultatoD = Main.chiamataD
    
    Dim job As HttpJob
    job.Initialize("", Me)
    job.Download("http://www.xxxxx.xxxxx/xxxxx/"& Main.linea & "/NumeroA.txt")
    Wait For (job) JobDone(job As HttpJob)
    If job.Success Then
        Dim testo As String = job.GetString
        Log(testo)
        If testo.StartsWith("A") Then
                    
            Log("su starter nel job " & risultatoA)
            If  job.GetString = risultatoA  Then
                Log("minchiaaaaa")
                        
                StartActivity(avviso)
            End If
            End If           
            End If
    job.Release
        
    Dim job As HttpJob
    job.Initialize("", Me)
    job.Download("http://www.xxxxx.xxxxx/xxxxx/"& Main.linea & "/NumeroB.txt")
    Wait For (job) JobDone(job As HttpJob)
    If job.Success Then
        Dim testo As String = job.GetString
        Log(testo)
        If testo.StartsWith("B") Then
                    
            Log("su starter nel job " & risultatoB)
            If  job.GetString = risultatoB  Then
                Log("minchiaaaaa")
                        
                StartActivity(avviso)
                        
            End If
End If
End If
    job.Release
        
    Dim job As HttpJob
    job.Initialize("", Me)
    job.Download("http://www.xxxxx.xxxxx/xxxxx/"& Main.linea & "/NumeroC.txt")
    Wait For (job) JobDone(job As HttpJob)
    If job.Success Then
        Dim testo As String = job.GetString
        Log(testo)
        If testo.StartsWith("C") Then
                    
            Log("su starter nel job " & risultatoC)
            If  job.GetString = risultatoC  Then
                Log("minchiaaaaa")
                        
                StartActivity(avviso)
                        
            End If
        End If
    End If
    job.Release
    
    Dim job As HttpJob
    job.Initialize("", Me)
    job.Download("http://www.xxxxx.xxxxx/xxxxx/"& Main.linea & "/NumeroD.txt")
    Wait For (job) JobDone(job As HttpJob)
    If job.Success Then
        Dim testo As String = job.GetString
        Log(testo)
        If testo.StartsWith("D") Then
                    
            Log("su starter nel job " & risultatoD)
            If  job.GetString = risultatoD  Then
                Log("minchiaaaaa")
                        
                StartActivity(avviso)
                        
            End If
        End If
    End If
    job.Release
    
End Sub

Sub Service_Destroy
    lock.ReleasePartialLock
    n.Cancel(1)
End Sub
appena si abilita il service, funziona solo per circa 20 secondi poi riparte ogni tanto a suo piacimento ma non ogni 3 secondi.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
la riga StartServiceAt devi spostarla alla fine, deve essere l'ultima riga prima di End Sub
altra cosa: non sono sicuro ma startforeground sei sicuro che serva lì dove lo hai messo tu ??
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Allora....non sono riuscito a far funzionare questo benedetto codice, dopo parecchio tempo sembra che viene uccisa l'app ma l'icona di notica rimane sempre li quindi non capisco perchè non si sveglia, altra cosa strana che mi capita ma questo anche prima, quando apro la prima volta l'app e inserisco sulla casella di testo corrispondente alla lettera A il numero e poi premo il bottone salva, praticamente l'app aggiunge alla casella di testo la lettera A e a seguire il numero che abbiamo scelto, subito dopo sempre alla pressione dello stesso bottone l'app va in background rimanendo la notifica, se io dopo qualche minuto invio lo stesso numero dal sito web l'app subito si sveglia dicendo che sono corrispondenti i numeri e questo li vedo anche dal log, ma se io apro l'app la prima volta ed inserisco il numero e premo il bottone salva, ma subito dopo voglio riaprire l'app per verificare che il numero ci sia ancora nella casella di testo in effetti c'è ma appena io esco e l'app ritorna in background succede una cosa strana, appena chiamo quel numero l'app non si sveglia, però dai logo i due numeri sono uguali e quindi dovrebbe svegliarsi con l'istruzione if. come se all'apertura la casella di testo non venga letta bene ma nei log mi risulta ok, questo il nuovo codice che sto provando con il consiglio di sirjo66 per i timer e per il consiglio del partial lock di MarcoRome + l'aggiunta del consiglio di Erel usando il gps tracking per rimanere sempre attiva, con la speranza di venirne a capo:
B4X:
#Region  Service Attributes
    #StartAtBoot: False
  
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
   
    Private nid As Int = 1
    Private GPS As GPS
    Private Tracking As Boolean
    Private LastUpdateTime As Long
    Private lock As PhoneWakeState
    Dim hc As     OkHttpClient
    Dim testo1 As String
    Dim risultatoA As String
    Dim risultatoB As String
    Dim risultatoC As String
    Dim risultatoD As String
   
End Sub

Sub Service_Create
   
    Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_NEVER 'we are handling it ourselves
    GPS.Initialize("gps")
    lock.PartialLock
    hc.Initialize("hc")
   
End Sub

Sub Service_Start (StartingIntent As Intent)
   
    Service.StartForeground(nid, CreateNotification("..."))
    StartServiceAt(Me, DateTime.Now + 30 * DateTime.TicksPerMinute, True)
    Track
   
    risultatoA = Main.chiamataA
    risultatoB = Main.chiamataB
    risultatoC = Main.chiamataC
    risultatoD = Main.chiamataD
   
   
    StartServiceAt(Me, DateTime.Now + 2 * DateTime.TicksPerSecond, True)
End Sub

Public Sub Track
    If Tracking Then Return
    If Starter.rp.Check(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) = False Then
        Log("No permission")
        Return
    End If
    GPS.Start(0, 0)
    Tracking = True
End Sub

Sub GPS_LocationChanged (Location1 As Location)
    If DateTime.Now > LastUpdateTime + 3 * DateTime.TicksPerSecond Then
        Dim n As Notification = CreateNotification($"$2.5{Location1.Latitude} / $2.5{Location1.Longitude}"$)
        n.Notify(nid)
        LastUpdateTime = DateTime.Now
        Dim job As HttpJob
        job.Initialize("", Me)
        job.Download("http://www.xxxxx.xxxxx/xxxxx/"& Main.linea & "/NumeroA.txt")
        Wait For (job) JobDone(job As HttpJob)
        If job.Success Then
            Dim testo As String = job.GetString
            Log("Testo = " & testo)
            If testo.StartsWith("A") Then
                   
                Log("su starter nel job " & risultatoA)
                If  job.GetString = risultatoA  Then ' qui mi fa il confronto se sono uguali allora mi sveglia l'app con il modulo activity, ma funziona solo al primo avvio
                    Log("minchiaaaaa")
                       
                    StartActivity(avviso)
                End If
            End If
        End If
       
        job.Release
       
        Dim job As HttpJob
        job.Initialize("", Me)
         job.Download("http://www.xxxxx.xxxxx/xxxxx/"& Main.linea & "/NumeroB.txt")
        Wait For (job) JobDone(job As HttpJob)
        If job.Success Then
            Dim testo As String = job.GetString
            Log(testo)
            If testo.StartsWith("B") Then
                   
                Log("su starter nel job " & risultatoB)
                If  job.GetString = risultatoB  Then  ' qui mi fa il confronto se sono uguali allora mi sveglia l'app con il modulo activity, ma funziona solo al primo avvio
                    Log("minchiaaaaa")
                       
                    StartActivity(avviso)
                       
                End If
            End If
        End If
        job.Release
       
        Dim job As HttpJob
        job.Initialize("", Me)
       job.Download("http://www.xxxxx.xxxxx/xxxxx/"& Main.linea & "/NumeroC.txt")
        Wait For (job) JobDone(job As HttpJob)
        If job.Success Then
            Dim testo As String = job.GetString
            Log(testo)
            If testo.StartsWith("C") Then
                   
                Log("su starter nel job " & risultatoC)
                If  job.GetString = risultatoC  Then ' qui mi fa il confronto se sono uguali allora mi sveglia l'app con il modulo activity, ma funziona solo al primo avvio
                    Log("minchiaaaaa")
                       
                    StartActivity(avviso)
                       
                End If
            End If
        End If
        job.Release
   
        Dim job As HttpJob
        job.Initialize("", Me)
        job.Download("http://www.xxxxx.xxxxx/xxxxx/"& Main.linea & "/NumeroD.txt")
        Wait For (job) JobDone(job As HttpJob)
        If job.Success Then
            Dim testo As String = job.GetString
            Log(testo)
            If testo.StartsWith("D") Then
                   
                Log("su starter nel job " & risultatoD)
                If  job.GetString = risultatoD  Then ' qui mi fa il confronto se sono uguali allora mi sveglia l'app con il modulo activity, ma funziona solo al primo avvio
                    Log("minchiaaaaa")
                       
                    StartActivity(avviso)
                       
                End If
            End If
        End If
        job.Release
    End If
End Sub

Sub CreateNotification (Body As String) As Notification
    Dim notification As Notification
    notification.Initialize2(notification.IMPORTANCE_LOW)
    notification.Icon = "icon"
    notification.Sound=False
    notification.Vibrate=False
    notification.SetInfo("Numero prenotato: " & Main.chiamataA &" " & Main.chiamataB & " " & Main.chiamataC & " " & Main.chiamataD & " ", "", Main)
    Return notification
End Sub

Sub Service_Destroy
    If Tracking Then
        GPS.Stop
    End If
    Tracking = False
    lock.ReleasePartialLock
End Sub

Sub testo_TextChanged (Old As String, New As String)
    If testo1 = Old Then
       
    Else
        Log("vai sulla sub Creafile")
    End If
End Sub

non pensavo fosse così difficile far funzionare una app in background senza essere uccisa dal sistema.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
1) la riga Service.StartForeground che cosa fa ?? Questa operazione devi farla una sola volta oppure devi farla ogni 3 secondi ??
2) ti sei accorto che nella routine Service_Start hai due volte l'operazione StartServiceAt ??
3) se l'utente ha il GPS spento, sei sicuro che la routine GPS_LocationChanged venga richiata regolarmente ??
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
1) la riga Service.StartForeground che cosa fa ?? Questa operazione devi farla una sola volta oppure devi farla ogni 3 secondi ??
2) ti sei accorto che nella routine Service_Start hai due volte l'operazione StartServiceAt ??
3) se l'utente ha il GPS spento, sei sicuro che la routine GPS_LocationChanged venga richiata regolarmente ??

Sirjo66 il Service.StartForeground non dovrebbe far andare l'app in background ?
in effetti noto che ci sono due startservice allora devo togliere quello da 30 minuti e lascio quello ogni 2 secondi, ho inserito il job nel GPS_locationChanged perché dopo un po si fermava nel fare il download, ma in effetti se l'utente non aggancia il gps in questo modo l'app sembra dormire, quindi proverò a rimettere su Service_Start il job e alla fine lascio StartServiceAt da 2 secondi, speriamo funzioni, stasera vi farò sapere appena ritorno dal lavoro.
 
Top