Italian Chiudere l'applicazione tranne il processo

Discussion in 'Italian Forum' started by ken87, Nov 18, 2018.

  1. ken87

    ken87 Active Member Licensed 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:
    Code:
    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:

    Code:
    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ì
    Code:
    CallSubDelayed(Servizio_Notifiche, "SubscribeToTopics")

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

    ken87 Active Member Licensed User

    Ho provato anche
    Code:
    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
     
  3. ken87

    ken87 Active Member Licensed User

    Ciao,
    ho scoperto che usando
    Code:
    ToastMessageShow("SERVICE ATTIVO",True)
    il servizio alla chiusura del programma resta attivo, mentre senza questo non avviene.
    Ho provato anche questo comando:
    Code:
    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
     
  4. LucaMs

    LucaMs Expert Licensed 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:
    Code:
    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):
    Code:
    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: Nov 19, 2018
  5. ken87

    ken87 Active Member Licensed User

    Ti ringrazio della risposta , non sai quante prove ho fatto senza successo.
    Ora provo e poi ti faccio sapere...
    :)
     
  6. ken87

    ken87 Active Member Licensed User

    Ciao ,
    io ho trovato la lib PhoneStateListener 1.30 ma non riconosce il tipo
    Code:
    PhoneWakeState
    Sai se c'è una versione più recente della libreria e dove?
    Grazie per ora
     
  7. udg

    udg Expert Licensed User

    Si riferiva alla libreria standard Phone. Basta utilizzare quella per il wakelock.
     
    LucaMs likes this.
  8. ken87

    ken87 Active Member Licensed User

    Grazie.. ora provo
     
  9. ken87

    ken87 Active Member Licensed User

    Ciao ,
    dalle prove che ho fatto se chiudo il programma dall'elenco di tutte applicazioni aperte il servizio smette di funzionare :(
     
  10. udg

    udg Expert Licensed 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.
     
  11. ken87

    ken87 Active Member Licensed 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
    Code:
    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
     
  12. udg

    udg Expert Licensed 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.
     
  13. udg

    udg Expert Licensed 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.
     
  14. ken87

    ken87 Active Member Licensed User

    Ciao ,
    seguendo le indicazioni con questo codice ogni 5 secondi il servizio dovrebbe controllare:
    Code:
    #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?
     
  15. sirjo66

    sirjo66 Well-Known Member Licensed 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
     
  16. ken87

    ken87 Active Member Licensed User

    Ciao dopo tutta la sera ho trovato una soluzione poco pulita ma sembra che funzioni
    Usando:
    Code:
    cs.Initialize.Color(Colors.Blue).Size(20).Append("").PopAll
            ShowCustomToast(cs, 
    TrueColors.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..
     
  17. udg

    udg Expert Licensed User

  18. ken87

    ken87 Active Member Licensed User

    Grazie ... ora guardo
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice