Italian StandBY e blocco procedura ricorsiva

Mirko Melegari

Member
Licensed User
Ho realezzaso un programma di invio sms multipli. Il gestionale aziendale crea gli sms da inviare ed un telefono li invia testando ciclicamente una cartella comune.
se interviene lo standby sul telefono perche non vi sono messaggi da inviare la procedura si ferma e non riparte piu'. ho visto che occorre startare un servizio che tenga vivo il programma, ma non so come fare.
Qualcuno puo' aiutarmi???
Grazie, Mirko
 

sirjo66

Well-Known Member
Licensed User
devi fare una cosa abbastanza precisa, oppure una cosa che può sbagliare di qualche minuto ??
 

sirjo66

Well-Known Member
Licensed User
innanzitutto sul tuo progetto devi aggiungere un "Service Module",
poi dentro agli attributi del servizio devi aggiungere:
#StartCommandReturnValue: android.app.Service.START_STICKY

Questo fa in modo che se il SO distrugge il tuo servizio, venga subito ricreato.
Questo sistema ha anche il vantaggio di ridurre il consumo di batteria, ma proprio per questo non è molto preciso quando deve essere chiamato ad una determinata ora (infatti da me sbaglia di circa 2-3 minuti).

Quando il servizio viene chiamato, fai tutto quello che devi fare, poi calcoli quando deve essere richiamato di nuovo questo servizio,
e utilizzando il comando StartServiceAt specifichi data e ora

Sergio
 

Mirko Melegari

Member
Licensed User
Ti ringrazio della soluzione, ma come faccio a far sì che il programma di invio sms da me realizzato rimanga attivo sempre una volta lanciato manualmente una prima volta. Io non devo attivarlo ad una data ora.
 

Mirko Melegari

Member
Licensed User
potresti mandarmi un esempio di codice relativo al servizio? Dovrei scrivere qualche cosa come:

#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.

End Sub

Sub Service_Create

End Sub

Sub Service_Start (StartingIntent As Intent)

End Sub

Sub Service_Destroy

End Sub


*****************
Devo scrivere qualche cosa nelle varie subs?
grazie
 

sirjo66

Well-Known Member
Licensed User
Lo scrivo al volo senza provarlo per cui devi poi sistemarlo
B4X:
Sub Service_Start(StartingIntent As Intent)

    Dim Adesso As Long = DateTime.Now
    DateTime.TimeFormat = "HH:mm:ss"
    Log(DateTime.Time(Adesso) & " Eseguo la procedura")

    ' in questo punto ci metterai tutto quello che la tua procedura deve fare
    ' ......
    ' ......

    ' procedura finita, ora calcolo quando fare la prossima volta la procedura, facciamo ad esempio tra 3 minuti (quindi 180 secondi)
    StartServiceAt("", Adesso + 180 * 1000, True)
    Log("Prossima esecuzione alle " & DateTime.Time(Adesso + 180 *1000))
    Log("------------------------------------------------")
End Sub
 

Mirko Melegari

Member
Licensed User
ti ringrazio per l'esempio ,Mi scuso ma forse non mi sono spiegato :
io non devo ristartare ciclicamente la mia app , ma semplicemente quando accade che se il telefono o lo schermo va in stand-by l'app deve continuare a lavorare e non fermarsi.
 

sirjo66

Well-Known Member
Licensed User
infatti la procedura che ti ho indicato non serve per restartare l'app, serve per fare una procedura ogni 3 minuti, anche se il telefono va in stand-by, mi sembrava di capire che era quello che ti serviva, cioè controllare una cartella ogni tot minuti anche con il telefono in stand-by ma forse ho capito male io
 

Mirko Melegari

Member
Licensed User
No a me serve semplicemente che la procedura rimanga viva anche se il telefono va in stand-by o in pausa per qualsiasi motivo.
attualmente ho risolto in modo barbaro lanciando prima l'app "No screen off" (downlod da googleplay )poi lancio la mia procedura MultiSMS .
In questo modo lo schermo non va mai in stand-by e quando su una cartella condivisa con il gestionale, arrivano sms da inviare, il telefono li invia.
 

sirjo66

Well-Known Member
Licensed User
il test che fa il tuo programma su questa cartella condivisa per vedere se c'è un sms da inviare, ogni quanto tempo lo fa ???
 

Mirko Melegari

Member
Licensed User
Ho messo un timer tarato a un secondo. Se arriva un file con n sms disable il timer, spedisco e enabled il timer per un nuovo invio
 

sirjo66

Well-Known Member
Licensed User
un secondo mi sembra un po' esagerato, secondo me lo puoi impostare a 30 secondi e invece che utilizzare il timer utilizzi il servizio come ti ho fatto l'esempio, che verrà quindi chiamato ogni 30 secondi anche se va in stand-by

l'esempio che ti avevo fatto era infatti per sostituire il timer con il Service

comunque puoi anche usare il Service ad ogni secondo, non ci sono problemi (almeno non credo)
 

Mirko Melegari

Member
Licensed User
Non posso perché il programma manda via 1 sms ogni 5 secondi se che è il tempo minimo che fa si che il buffer del telefono non si intasi. Da gestionale possono arrivare anche liste superiori a 500 sms in un unico file ed il tempo di invio può superare anche la mezza ora. L'unica cosa che vorrei fare è impedire lo stand by e lasciare il programma così come è.
 
Top