Italian applicazione/servizi in background

atomic

Member
Ciao a tutti
Volevo chiedervi, per cortesia, come implementare un app che mi lavori in background.
Cioè la mia app mi deve avvisare ad un orario preciso...è possibile mandarla in background ?

qui :
https://www.b4x.com/android/forum/threads/how-to-run-a-b4a-app-in-the-background.7285/

ne parlano, il post è del 2011 e dicono che all'epoca non era possibile e che dovevano implementare dei servizi per poter pianificare le applicazioni.
Oggi 2017 spero che si possa fare.
Potreste aiutarmi per cortesia ?
Grazie a tutti.
Ciao
PS
Ho b4a trial versione 7
 

Star-Dust

Expert
Licensed User
Longtime User
certo che è possibile ma da sempre, ma come detto da @LordZenzo non sarà l'app a lavorare in background ma il Service che avvierà l'activity nel momento che tu vuoi.
Non avremmo alert dal calendario se non si potesse fare
 

atomic

Member
Ciao cari
Ho visto qualche esempio sui service ma non riesco ad implementarlo nella mia app.
L'utente che usa la mia app ad un certo punto imposta dopo quanti minuti deve essere avvisato e preme un pulsante, a questo punto la mia app si deve chiudere (o diventare invisibile non so) e quindi deve partire il service in background.
L'avviso dovrebbe apparire tipo un msgbox oppure una piccola spia di colore rosso nella statusbar dove poi l'utente ci cliccherà sopra e ripartirà l'app.
Ho aggiunto il modulo service...ma non so come chiudere l'app, avviare il service, passargli i minuti di attesa, e far apparire il msg.
Per cortesia potreste aiutarmi ?
Ciao
B4A versione 7.0
 

atomic

Member
Ok, allora sono riuscito a seguire un piccolo tutorial trovato qui
https://www.b4x.com/android/forum/threads/service-modules.7542/#content

nell'app

Sub BtnOk_Click
Timer1.Initialize("Timer1",1000)
Timer1.Enabled=True
Me.hide
StartService(srv)
End Sub


Sub Timer1_Tick
Label4.Text=srv.Counter
If srv.Counter=5 Then
Msgbox ("ciao","")
End If
End Sub


ma non ho capito come e se devo chiudere la mia app o devo semplicemente nasconderla quando eseguo lo startservice
Come si puo' notare dal sub Timer1_Tick controllo ogni secondo la variabile counter definita nel modulo service "srv"...allora mi chiedo che senso ha usare un service quando potrei fare tutto nel main dell'app? ci sarà qualcosa che mi sfugge...
 

Star-Dust

Expert
Licensed User
Longtime User
Credo che hai confusione sul funzionamento del service.

1) Chiudere l'App. ExitApplication (Cmq rimarra in memoria, perchè solo il sistema operativo può uccidere definitivamente l'app)
Puoi anche simulare che sia schiacciato il tasto Home
B4X:
Dim i As Intent
i.Initialize (i.ACTION_MAIN ,"")
i.AddCategory ("android.intent.category.HOME")
i.Flags =0x3400000
i.SetComponent ("android/com.android.internal.app.ResolverActivity")
StartActivity(i)[/B]
2) Il Timer a che serve?
3) Far partire il service ogni tot tempo
B4X:
Sub BtnOk_Click
StartServiceAt(svr,Tempo,False)
ExitApplication
End Sub
Nel service
B4X:
Sub Service_Create
    'This is the program entry point.
    'This is a good place to load resources that are not specific to a single activity.
    StartServiceAt(Me,Tempo,False)
End Sub

Sub Service_Start (StartingIntent As Intent)
    ' Avvisi
    'Controlli
    'Codice
End Sub

Il service fa i suoi controlli e avvisi e si conclude. Ma nel Create hai messo che riparte dopo Tempo e quando trascorre questo tot viene riavviato in BackGround e cosi via.
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
Il Timer e il suo conteggio li devi mettere nel Service che continua a lavorare anche quando l'app viene chiusa.
Se li metti nella app questi smettono di lavorare quando l'app viene chiusa.
 

Star-Dust

Expert
Licensed User
Longtime User
Il Timer e il suo conteggio li devi mettere nel Service che continua a lavorare anche quando l'app viene chiusa.
Se li metti nella app questi smettono di lavorare quando l'app viene chiusa.
Se mette ServiceStartAt, non é nemmeno necessario il timer che tiene il service sempre attivo.


Poi c'è da impostare quando fermar eil service con un altro Bottone, StopService(svr) se necessario fermarlo.. Adesso non hai spiegato cosa fa questo servizio e quindi non sappiamo se deve rimaner eo meno. Se deve partire al boot del dispositivo o all'avvio dell'App.... ecc....
 

Sagenut

Expert
Licensed User
Longtime User
Io ho capito che dalla app lui vuole decidere un tempo (diciamo 30 secondi) e confermare questo tempo premendo un bottone.
A quel punto l'app deve sparire e il Service deve prendersi carico di contare i 30 secondi.
Al termine dei 30 secondi il Service deve far apparire un messaggio, una notifica o riaprire l'app.
 

Star-Dust

Expert
Licensed User
Longtime User
Il timer nel service per esperienza lo eviterei, se non fosse proprio necessario. Qui mi sembra evitabile
 

Sagenut

Expert
Licensed User
Longtime User
Potrebbe fare un calcolo dell'orario target da quando imposta il suo intervallo e far controllare quando l'orario e' raggiunto.
O usare l'orario target per il ServiceStartAt magari.
 

Star-Dust

Expert
Licensed User
Longtime User
Si. Io salverei il tempo scelto in un file. E il Service all'avvio carica il file, vede il Tempo e lo rilancia con ServiceStart.. poi soluzione ce ne sono diverse dipende da cosa preferisce. Ma quella che ha scritto lui non funziona.... ne scelga una funzionate
 

Star-Dust

Expert
Licensed User
Longtime User
Il rischio di usare il Timer sta nel fatto che se si uccide l'App da Android si chiude anche il Service. Mentre con StartServiceAt(Svr,DateTime.TickForMinute/2,False) riparte comunque ogni 30 secondi
 

atomic

Member

Perfetto!!!
In poche parole io apro la mia app imposto dopo quanti minuti mi deve avvisare.
Premo un pulsante e la mia app deve "sparire"...nel senso che non deve essere più visibile, non so che comando utilizzare!!
dopo tot minuti mi deve apparire un msg o una notifica o la mia app stessa che mi chiede se deve continuare ad avvisarmi (magari cambiando anche il numero di minuti) o deve smettere di avvisarmi...chiudendo il service e l'app.
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
nel senso che non deve essere più visibile, non so che comando utilizzare!
To ho già indicati come chiudere l'App al post#6 di questo thread
 

Star-Dust

Expert
Licensed User
Longtime User
@atomic .... ti dobbiamo scrivere tutto il codice?

Soluzione 1

B4X:
' Nell'activity
Sub Button1_Click
    StartServiceAt(svr,DateTime.TicksPerSecond*30,False)
    Activity.Finish
End Sub

Sub AlertBeep
    Dim B As Beeper
      
    B.Initialize(300,300)
    B.Beep
    B.Release
  
   if Msgbox2("Vuoi un altro avviso","ALERT","Si","","No",Null)=Dialogresponse.Positive Then
      ' Fai ripartire il pannello con la scelta del tempo
   End If
End Sub
'Nel Service
Sub Service_Create
    'This is the program entry point.
    'This is a good place to load resources that are not specific to a single activity.
  
End Sub

Sub Service_Start (StartingIntent As Intent)
    ' Se vuoi gestire
    CallSub(Main,"AlertBeep")
End Sub

Soluzione 2
B4X:
' Nell'Activity
Sub Button1_Click
    StartServiceAt(Starter,DateTime.TicksPerSecond*30,False)
    Activity.Finish
End Sub
' Nel Service
Sub Service_Create
    'This is the program entry point.
    'This is a good place to load resources that are not specific to a single activity.
    Dim N As Notification
  
    N.Initialize
    N.SetInfo("Alert","Vuoi un nuovo avviso?",Main)
    N.Sound=True
    N.Vibrate=True
    N.Icon="icon"
    N.Notify(1)
End Sub

Nella prima soluzione il service viene attivato dopo che é trascorso il tempo impostato e riavvia l'attività facendo partire una Sub dell'attività stessa che contiene un Beep e un MessageBox che chiede se vuoi un nuovo avviso ... e poi li continua tu.

Nella seconda soluzione il service parte dopo che trascorre il tempo impostato e avvia una notifica che avvisa con un suuono e una vibrazione. Fra le notifiche apparirà un messaggio in cui chiede se vuoi un altro avviso, cliccando si riapre l'activity che ti permette di selezionare l'avviso.

Poi facciamo a metà se diventi milionario.
 
Last edited:

udg

Expert
Licensed User
Longtime User
Ciao,

non sono d'accordo con la soluzione 1 per un paio di motivi. Il primo è l'utilizzo di Starter come servizio da far ripartire (è una pratica fortemente sconsigliata da Erel); il secondo è l'utilizzo di CallSub per accedere alla sub presente in Main. CallSub funziona se Main in quel momento è attivo e questo in genere non sarà vero. Si potrebbe ovviare con CallSubDelay che ha il pregio di far ripartire Main, ma l'invio di una notifica come per la soluzione 2 resta sempre più pulito, a mio avviso.

Personalmente utilizzerei Main (o altra activity dedicata) per consentire all'utente sia di avviare/fermare il servizio sia di definire il lasso temporale tra un risveglio e l'altro del servizio.
Al suo risveglio, il servizio potrebbe auto-programmarsi per risvegliarsi di nuovo dopo x minuti, a meno che nel Main (o activity alternativa) venga fermato.

C'e' da considerare anche lo StartAtBoot per il servizio, altrimenti dopo uno spegnimento del device non verrà riavviato.
 

Star-Dust

Expert
Licensed User
Longtime User
Ho messo starter per errore, ho aperto un progetto vuoto e ho approfittato del servizio starter solo per scrivere il codice, ma ovviamente per i motivi da te descritti non lo avrei usato nemmeno io. (L'ho corretto per i posteri)

Per l'avvio del Main è vero , ma si può superare in tanti modi uno dei quali quello da te descritto, oppure con StartActivity ecc..
Poi dipende se si voglia o meno avviare l'activity Main, oppure se si vuole fare partire un altra activity, e infine se non si vuole nessuna activity ma solo generare un beep dal service stesso senza far partire nulla...

Dello start Boot ne parlo nel post#8
 
Last edited:
Cookies are required to use this site. You must accept them to continue using the site. Learn more…