Italian far funzionare app in background

udg

Expert
Licensed User
Longtime User
Nel tuo caso: era , è , sarà. Il forum senza di te non esisterebbe
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Allora....grazie al vostro aiuto sono riuscito a far funzionare l'app che riceve i dati con il metodo httputils2 usando il job.download e scaricandosi il documento di testo il tutto in background, e grazie alla spiegazione di udg ho dichiarato delle variabili che non sapevo come farle dialogare tra una activity ed un modulo service, in questo modo ho potuto creare due stringhe di testo per i due numeri ricevuti: Numero A e numero B, ho solo notato un particolare, oggi nel mio paese c'è stato scarso segnale di tlefonia con conseguenze caduta di connessione internet, questo ha fatto modo che quando il timer ogni 4 secondi permette il job.download del documento nel momento della caduta di connessione mi comparivano una serie di errori di java dovuti alla connessione, questi venivano visualizzati con il toast message, ho notato anche che però l'app funzionav lo stesso appena prendeva il segnale anche se questi errori erano ancora visibili, allora mi sono chiesto: se elimino il toast message degli errori pensate che possa provocare qualcosa essendo che l'app sembra non avere problemi?
questo il codice secondo me incriminato e che si trova dentro la sub di httpjob del modulo di servizio e all'interno di questa sub vedrete anche il codice per il confronto con il numero che il cliente ha impostato come allarme per essere avvisato dell'imminente chiamata del suo numero.
B4X:
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
                If  job.GetString = risultatoA  Then
                       
                        StartActivity(avviso) ' qui faccio aprire un modulo activity che mi fa suonare un file audio mp3 e con il modulo tts avvisa della chiamata del numeroA
                        
                    End If
                else if testo.StartsWith("B") Then
                  
                    If  job.GetString = risultatoB  Then
                        Log("minchiaaaaa")
                        
                        StartActivity(avviso)' qui faccio aprire un modulo activity che mi fa suonare un file audio mp3 e con il modulo tts avvisa della chiamata del numeroB
                    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) ' questo il toastmessage degli errori visualizzati in mancanza di segnale o caricamento della pagina interrogata.
    End If
    job.Release
    
End Sub
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
ora mi si presenta un'altro problema, poichè utilizzo la libreria delle notifiche e quando va in background con il modulo di servizio la notifica rimane attiva, come posso fare per chiudere la notifica quando decido di uscire dall'app con il metodo exitapplication?
praticamente non riesco ad uscire dall'app, rimane sempre l'icona anche se il modulo di servizio relativo lo tento di chiudere, altra domanda..... vorrei poter visualizzare su questa notifica il numero visualizzato al posto di caricare l'activity(avviso) ma non riesco a capire come fare dato che su: n.SetInfo("NUMERO", "txtmessagerx.text",Main)
e sbagliato, come dovrei completarlo essendo che alla fine mi rinvia al main? allego tutto il modulo di servizio per comprendere le due problematiche.
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.
    Dim N As Notification
    Dim hc As     OkHttpClient
    Dim testo As String
    Dim timer1 As Timer
    Dim timer2 As Timer
    Dim risultatoA As String
    Dim risultatoB 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", "txtmessagerx.text",Main)
    n.Notify(1)
    hc.Initialize("hc")
    timer1.Initialize("timer1",4000)
    timer2.Initialize("timer2",4000)
    
    
    timer1.Enabled=True
    timer2.Enabled=True
End Sub

Sub Service_Start (StartingIntent As Intent)
    n.Notify(1)
    
    Service.StopAutomaticForeground 'Call this when the background task completes (if there is one)
    
End Sub
Sub timer1_Tick
    Log("sono sulla sub timer1 di Starter")
    Dim job As HttpJob
    job.Initialize("Job", Me)
    job.Download("http://www.xxxx.xxx/xxxxx/xxxxx/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.xxxx/xxxx/xxxx/NumeroB.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 minchia funziona!!!!")
                        StartActivity(avviso)
                        
                    End If
                else if testo.StartsWith("B") Then
                    
                    If  job.GetString = risultatoB  Then
                        Log("minchiaaaaa funziona!!!!")
                        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

mentre per chiudere l'app nel modulo startactivity(avviso) ho inserito un pulsante ad immagine con questo codice:
B4X:
Sub imgexit_Click
    StopService(Starter)
    ExitApplication
    
End Sub
ma non riesco completamente ad uscire perchè l'icona di notifica rimane sempre, quindi cliccandoci ritorna alla main principale.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Risolto il problema della notifica che non mi faceva uscire completamente dall'app. rimane solo il problema che nella notifica non so come visualizzare il numero chiamato, ho dovuto mettere qualcosa a caso per funzionare l'icona: n.SetInfo("NUMERO", "txtmessagerx.text",Main),
qualcuno sa dirmi come fare a farlo funzionare nel modulo di servizio?
 

udg

Expert
Licensed User
Longtime User
Ciao, nel codice che hai pubblicato al post #47 vedo alcuni problemi:
-avii la notifica due volte (create e start hanno entrambi Notify(1)
- hai due timer che scattano allo stesso istante. Ciascuno avvia un download, ma entrambi i Job hanno lo stesso nome.
- per avviare un'activity dal service dovresti utilizzare CallSubDelayed(<nome activity>, <nome sub da eseguire>)
- tutto ciò che riguarda la notifica potresti metterlo in una sub che chiami quando serve (ricezione numero), a cui passi come parametro il numero che vuoi far apparire nel titolo o corpo della notifica.
 

LucaMs

Expert
Licensed User
Longtime User
Sì, vero, ma... come "riaccendere" il display? Cerco :D...
Si può usare un metodo non proprio corretto;

Nel servizio:
B4X:
Sub Process_Globals
   Private mPhoneWakeState As PhoneWakeState

' e quando serva riaccendere il display:
    mPhoneWakeState.KeepAlive(True)

Non è del tutto corretto in quanto il vero scopo di KeepAlive è impedire che il display si spenga (lo smartphone vada in standby), però lo riattiva.
E' possibile togliere subito dopo il KeepAlive, se lo scopo sia solo quello di "svegliare" il dispositivo (ReleaseKeepAlive).
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Poi mi domando: con tutte le "novità" che Google introduce, impedimenti e permessi vari, possibile che non sia necessario un permesso super speciale affinché un'app possa essere riattivata mentre ne sia già attiva un'altra?

Voglio dire: sto battendo tutti i record mondiali in un determinato gioco e improvvisamente un'app, se sviluppata con B4A usando StartActivity(xxx), manda in background il mio gioco per attivare sé stessa. Possibile che sia consentito?
 

udg

Expert
Licensed User
Longtime User
E' propio quello che spesso si è detto nel forum internazionale. Quando la tua app si sveglia non dovrebbe prendere il controllo della UI (soppiantando quella in esecuzioen) perché rischieresti di far incavolare l'utente. Sarebbe meglio che la tua app (o, meglio, il servizio risvegliato della tua app) si limitasse a svolgere il suo compito ed eventualmente ad inviare una notifica. Poi sarà l'utente a decidere come e se gestire la notifica (eliminarla senza pietà, ignorarla per la prox ora, aprirla e portare la tua app in foregroud)
 

LucaMs

Expert
Licensed User
Longtime User
"Lettuto", anche se non so come Whatsapp utilizzi Firebase message - o come lo faccia qualunque altra app; ovviamente perché non me ne sono interessato.

Generalmente, meglio non affidarsi a servizi esterni, se possibile, sia perché un giorno il servizio potrebbe non essere più disponibile, sia perché potrebbero metterlo a pagamento o aumentarne il costo.
 

udg

Expert
Licensed User
Longtime User
Firebase ha il vantaggio di "essere parte del sistema", quindi i messaggi gli arrivano sempre e comunque. Utilizzandolo (basta seguire il tutorial alla lettera) riesci a ricevere messaggi anche a device spento (per un certo lasso di tempo).
Se vuoi essere autonomo hai sempre MQTT, ma la tua app deve essere in foreground per riceverne i messaggi

Sempre che tu non voglia attivare un servizio tipo polling, con la tua app che interroga incessantemente il povero server.,.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Ciao, nel codice che hai pubblicato al post #47 vedo alcuni problemi:
-avii la notifica due volte (create e start hanno entrambi Notify(1)
- hai due timer che scattano allo stesso istante. Ciascuno avvia un download, ma entrambi i Job hanno lo stesso nome.
- per avviare un'activity dal service dovresti utilizzare CallSubDelayed(<nome activity>, <nome sub da eseguire>)
- tutto ciò che riguarda la notifica potresti metterlo in una sub che chiami quando serve (ricezione numero), a cui passi come parametro il numero che vuoi far apparire nel titolo o corpo della notifica.

mi puoi fare un esempio di codice per capire meglio come fare questa notifica in una sub?
 

udg

Expert
Licensed User
Longtime User
Per non stravolgere troppo le cose, nel tuo codice puoi sostituire:
StartActivity(avviso)
con
B4X:
dim n as notification
n.Initialize
n.Icon = "icon"
n.Sound = False
n.Vibrate = False
n.Light = False
n.SetInfo(RisultatoA, "txtmessagerx.text", avviso)
n.Notify(1)
In pratica, se il server ti invia il "numero" giusto, tu predisponi la notifica e lasci che sia l'utente ad aprirla. Ovviamente Avviso sarà in grado di mostrare numero e messaggio che avrai salvato a livello generale (o su un file)
Se devi mostrare separatamente notifiche di tipoA e di tipoB, allora usa numeri di notifica diversi (Notify(x)) es. 1 e 2)

Un consiglio: se ogni 4 sec interroghi il server per farti dire quali sono sia A che B in quel momento, allora esegui i download a cascata (visto che apparentemente sembra tu non abbia una versione B4A che consenta il WaitFor).
Quando dico a cascata intendo dire che il secondo parte dalla fine del Case del primo nel JobDone.

Giusto per avere un'idea:
B4X:
Sub JobDone (job As HttpJob)
Log("JobName = " & job.JobName & ", Success = " & job.Success)
If job.Success = True Then
   Select job.JobName
       Case "job1"
            '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 minchia funziona!!!!")
                        'prepara ad avvia la notifica con RisultatoA
                  End If
                  dim j1 as httpjob
                  j1.Initialize("job2", Me)
                  j1.Download("http://www.xxxxx.xxxx/xxxx/xxxx/NumeroB.txt")
             else
               'gestisci errore
             end if
          Case "job2"
                 testo =job.GetString
                 Log(job.GetString)
                 if testo.StartsWith("B") Then
                    If  job.GetString = risultatoB  Then
                        Log("minchiaaaaa funziona!!!!")
                        'prepara ad avvia la notifica con RisultatoB
                    End If
                else
                   'gestisci errore
                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
 
Last edited:
Top