Italian Chiudere l'applicazione tranne il processo

ken87

Active Member
Licensed User
Longtime User
Avrei la necessità di chiudere il mio programma senza chiudere il processo che ha il compito di ricevere notifiche.
Il processo resta in ascolto in questo modo:
B4X:
Sub Service_Start (StartingIntent As Intent)
    Listener
    Service.StopAutomaticForeground 'Call this when the background task completes (if there is one)
    
    
End Sub

Sub Listener

    Do While True
            ToastMessageShow ("Aspetto notifica nuova",True)
        Sleep(5000)
        
    Loop
End Sub
Poi ho inserito un tasto chiudi nella mia applicazione:

B4X:
Sub esci_Click
ExitApplication    ' se uso questo chiude tutte le activity ma ferma il servizio

Activity.Finish ' se uso questa chiude solo l'ultima finestra , ma tiene il servizio attivo

End Sub

Il servizio lo chiamo così
B4X:
    CallSubDelayed(Servizio_Notifiche, "SubscribeToTopics")


Che istruzione esiste per chiudere tutte le activity senza chiudere il servizio?
Ringrazio in anticipo
 

ken87

Active Member
Licensed User
Longtime User
Ho provato anche
B4X:
Activity.RemoveAllViews ' rimuove le finestre
Rimuove le finestre , lascia il servizio attivo ma lascia l'applicazione aperta...

A me servirebbe chiudere l'applicazione finestre e servizio attivo.
Si può fare?
Grazie mille
 

ken87

Active Member
Licensed User
Longtime User
Ciao,
ho scoperto che usando
B4X:
ToastMessageShow("SERVICE ATTIVO",True)
il servizio alla chiusura del programma resta attivo, mentre senza questo non avviene.
Ho provato anche questo comando:
B4X:
Sub Service_Start (StartingIntent As Intent)
    Listener
    Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_ALWAYS
End Sub
Ma nulla.
Come faccio a chiudere il programma senza la chiusura del servizio?
Grazie mille
 

LucaMs

Expert
Licensed User
Longtime User
Ciao. Non prendere per oro colato ciò che sto per scrivere, in quanto non ho mai provato, ho solo letto roba in giro. Rispondo pur non essendo certo, giusto perché nessun altro lo sta facendo :)

Per mantenere un servizio sempre attivo (non può essere lo Starter), ho letto che devi usare StartForeground, per il quale è necessario usare un intent. Inoltre, come scrive spesso Erel, devi "acquisire un partial lock".

Dovrebbe essere qualcosa del genere:
B4X:
Sub Service_Start (StartingIntent As Intent)
       Dim n As Notification
       n.Initialize
       n.Icon = "icon"
       n.Sound = False ' facoltativo
       n.Vibrate = False ' facoltativo
       n.SetInfo("Questo è il titolo", "Questo il body", Main)
       Service.StartForeground(1, n)
End Sub

Per il partial lock (serve la libreria Phone):
B4X:
Dim mPhoneWS As PhoneWakeState
mPhoneWS.PartialLock


Per chiudere un'Activity devi usare Activity.Finish. Al limite puoi seguire questo suggerimento di Erel:
https://www.b4x.com/android/forum/threads/close-all-activity-at-once.64719/#post-409989
 
Last edited:

ken87

Active Member
Licensed User
Longtime User
Ti ringrazio della risposta , non sai quante prove ho fatto senza successo.
Ora provo e poi ti faccio sapere...
:)
 

ken87

Active Member
Licensed User
Longtime User
Ciao ,
io ho trovato la lib PhoneStateListener 1.30 ma non riconosce il tipo
B4X:
PhoneWakeState
Sai se c'è una versione più recente della libreria e dove?
Grazie per ora
 

udg

Expert
Licensed User
Longtime User
Si riferiva alla libreria standard Phone. Basta utilizzare quella per il wakelock.
 

ken87

Active Member
Licensed User
Longtime User
Ciao ,
dalle prove che ho fatto se chiudo il programma dall'elenco di tutte applicazioni aperte il servizio smette di funzionare :(
 

udg

Expert
Licensed User
Longtime User
E' una delle simpatiche caratteristiche di Android (quanto meno delle versioni più recenti).
Eliminando un'app dall'elenco delle recenti, la fermi del tutto finché l'utente non si prende la briga di riavviarla.
 

ken87

Active Member
Licensed User
Longtime User
Ciao ,
Il problema che il mio programma si collega al mio server se ci sono notifiche le scarica anche se è chiuso.
Come posso fare per farlo restare in ascolto evitando la chiusura del servizio?
Ad esempio questa istruzione
B4X:
ToastMessageShow("SERVICE ATTIVO",True)
Impedisce la chiusura, ma non posso usarla se no resta il messaggio in mezzo.
Devo dirgli avvia il servizo anche se l'applizaione è chiusa, se trova notifiche le scarica
 

udg

Expert
Licensed User
Longtime User
La strada maestra sarebbe l'utilizzo del Firebase messaging. In questo caso i messaggi dal server arriverebbero sempre e comunque alla tua app. Per un certo lasso di tempo anche a telefono spento (nel senso che al riavvio la tua app verrebbe svegliata dal messaggio inviato mentre il device era spento).
Se segui alla lettera il Tutorial sul FB messaging in 4 minuti di orologio avrai sia l'app mobile B4A pronta a ricevere messaggi sia il modulo B4J per inviarli.
Non ti resterà che integrare il codice di invio al tuo programma sul server ed avrai una soluzione ottimale.
 

udg

Expert
Licensed User
Longtime User
In alternativa, inserisci nella app un service (in aggiunta a Starter). Definisci il service come bootable, lo avvi in foreground e attivi il WakePartialLock insieme ad un timer che ogni x minuti chiede al server se ha messaggi. In caso affermativo invia una notifica e l'utented ecide se darle retta o meno.

Un meccanismo simile potrebbe impiegare MQTT invece del polling continuo del server.
 

ken87

Active Member
Licensed User
Longtime User
Ciao ,
seguendo le indicazioni con questo codice ogni 5 secondi il servizio dovrebbe controllare:
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.
   Dim mPhoneWS As PhoneWakeState
   Dim n As Notification
End Sub

Sub Service_Create
    Service.AutomaticForegroundMode=Service.AUTOMATIC_FOREGROUND_ALWAYS
pw.PartialLock
End Sub

Sub Service_Start (StartingIntent As Intent)
   
    Do While True
    Log("Il servizio è in esecuzuone")
   ' Qui chiamero la procedura che si collega al server
    Sleep(50000)
    Loop  
End Sub
Ma se chiudo il programma muore anche il ciclo .. cosa sbaglio?
 

sirjo66

Well-Known Member
Licensed User
Longtime User
innanzitutto non usare Sleep, devi creare un servizio che risponde a qualcosa, quindi devi utilizzare altro, ad esempio StartServiceAt e poi devi impostare il servizio come Stiky (non mi ricordo come si scrive) altrimenti è normale che si comporti come descrivi tu
 

ken87

Active Member
Licensed User
Longtime User
Ciao dopo tutta la sera ho trovato una soluzione poco pulita ma sembra che funzioni
Usando:
B4X:
cs.Initialize.Color(Colors.Blue).Size(20).Append("").PopAll
        ShowCustomToast(cs, True, Colors.Transparent)
Questa funzione disegna ToastMessageShow trasparente.
In questo modo l'istruzione obbliga il programma a restare in esecuzione ma nello stresso tempo il box resta nascosto..
Potrebbe non funzionare col telefono che si spegne ma meglio di niente..
 

udg

Expert
Licensed User
Longtime User
Top