Italian Notifica giornaliera

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Ciao,
usando la libreria NotificationBuilder, come posso avere una notifica costante per 30 secondi, usando un servizio?
 

Straker

Active Member
Licensed User
Longtime User
Cosa intendi per 'notifica costante per 30 secondi'?
Una notifica ogni 30 secondi?
O una notifica che rimanga per 30 secondi e poi sparisca? (Ma questo sarebbe il contrario del concetto di notifica)
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Cosa intendi per 'notifica costante per 30 secondi'?
Una notifica ogni 30 secondi?
O una notifica che rimanga per 30 secondi e poi sparisca? (Ma questo sarebbe il contrario del concetto di notifica)

Una notifica ogni 30 secondi
 

Straker

Active Member
Licensed User
Longtime User
Sinceramente non capisco a cosa possa servire una notifica ogni 30 secondi...

Magari per un allarme al quale bisogna dare assolutamente una risposta?

Ma in quel caso non sarebbe meglio far partire un file audio?

Comunque, potresti in Sub Service_Start inserire un StartServiceAt con un timing a now + 30 secondi, far apparire la notifica e poi chiudere subito il servizio, che tanto tra 30 secondi riprende da solo. E uccidere il servizio quando l'utente clicca sulla notifica.
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Sinceramente non capisco a cosa possa servire una notifica ogni 30 secondi...

Magari per un allarme al quale bisogna dare assolutamente una risposta?

Ma in quel caso non sarebbe meglio far partire un file audio?

Comunque, potresti in Sub Service_Start inserire un StartServiceAt con un timing a now + 30 secondi, far apparire la notifica e poi chiudere subito il servizio, che tanto tra 30 secondi riprende da solo. E uccidere il servizio quando l'utente clicca sulla notifica.

E' solo per fare dei test, la notifica mi serve perchè deve partire come risultato da una query
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Vedo se mi può essere utile
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Per ora mi basta questo codice:

B4X:
Log("Service Start")
StartServiceAt("", DateTime.Now + 10 * DateTime.TicksPerSecond, False)
CallSub(Main, "PartitaDelGiorno")

La sub "PartitaDelGiorno" fa comparire la notifica ogni 10 secondi se la query ha qualche risultato.
Mi sono accorto però che quando premo sulla notifica, il servizio si stoppa. E' possibile?
 

Straker

Active Member
Licensed User
Longtime User
Ok, Ora capisco. Ė un servizio che ogni 10 secondi fa una query e solo se trova qualcosa fa una notifica.
Ti rispondo fra un po'
 

Straker

Active Member
Licensed User
Longtime User
In questo caso forse era meglio uno sticky Service con dentro un timer... Ma ė una domanda da fare agli esperti.

Per quanto riguarda il fatto che il servizio si stoppa quando l'utente clicca sulla notifica, non so darti risposta (dovrei fare delle prove, e le farò domani). Però non credo si stoppi il servizio, ma semplicemente il sistema di notifica vede che l'activity collegata a quella notifica ė già in foreground e quindi non serve fare la notifica.

In questo caso dovresti controllare prima di fare la notifica. Ovvero se la tua attività IsPaused allora vai con la notifica, altrimenti mostri direttamente il messaggio nella tua app.

Capito il concetto?
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Si ma secondo me la fai troppo difficile.
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Quand'è che un servizio si stoppa?
 

Straker

Active Member
Licensed User
Longtime User
Un servizio si stoppa in questi casi:
  1. Il sistema operativo ha deciso di far fuori il servizio per liberare risorse. Ma se ne hai uno schedulato poi riparte.
  2. Fermi tu il servizio con StopService("nomeservizio"), se ne hai uno schedulato, poi riparte
  3. Fermi sia il servizio attivo che quello schedulato: StopService + CancelScheduledService

Ma nel tuo caso non credo che sia il servizio a fermarsi, ma semplicemente le notifiche. Prova a farti un log ad ogni chiamata sql che fai (quella richiamata dal servizio, per intenderci) così vedi se il servizio continua a lavorare in background anche quando la tua app è in foreground.
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
si ma cosa cambia da un log ad una notifica?
Comunque è sempre una risposta da parte dell'app
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Usando questo codice sul service module:
B4X:
Sub Service_Start (StartingIntent As Intent)
Log("Service Start")
    StartServiceAt("", DateTime.Now + 10 * DateTime.TicksPerSecond, True)
CallSub(Main, "GG")
End Sub

La sub GG è quella che richiama la notifica.

Quando esco dall'app il log diventa così:

B4X:
** Service (start) Create **
Service Started
** Service (start) Start **
Service Start
Avvio GG
** Service (start) Start **
Service Start
Avvio GG
** Activity (main) Pause, UserClosed = false ** <--ESCO SENZA CHIUDERE IL PROCESSO
** Service (start) Start **
Service Start
** Service (start) Start **
Service Start

e così non ho più la notifica.

[MODIFICA]
L'istruzione:
B4X:
StartService("start")

dove la devo mettere?
 
Last edited:

Straker

Active Member
Licensed User
Longtime User
Ovviamente non hai più la notifica. Il processo è chiuso. Il servizio sta funzionando ma la tua CallSub non viene eseguita in quanto non c'è più in memoria un 'Main' da chiamare.

Immagina che Activity e Service siano due cose distinte. Puoi chiudere l'una e lasciare attiva l'altra, e viceversa. Ovviamente se l'una è chiusa (il processo è terminato) non è più possibile richiamare in vita una Sub che non esiste più.
 

Straker

Active Member
Licensed User
Longtime User
Teoricamente potresti chiamare una CallSubDelayed che è come una CallSub ma prima di eseguire ti riattiva la activity.
Vedi http://www.b4x.com/android/forum/th...teract-between-activities-and-services.18691/

Però nel tuo caso non va bene.
Infatti dovresti dividere le cose.
Nel Service ci metti i controlli che fai ogni tot e nell'activity ci metti la parte di visualizzazione ed interazione con l'utente.
Teoricamente un Service dovrebbe chiamare una activity solamente per riportarla in vita e non per eseguire delle operazioni 'di routine'.
Al limite puoi tenere il servizio in un service module, il codice che ti serve per seguire notifiche e controlli in un modulo bas separato e tieni la user interface nella activity.

Se sei un programmatore VisualBasic (come immagino) puoi immaginare il servizio come un modulo speciale che rimane residente in memoria ed esegue dei task, mentre la tua activity è il form. Dal servizio non puoi richiamare procedute contenute nella form se prima non visualizzi la form...
 
Top