Italian [B4A] StartAtBoot gestito da un B4XSwitch in una B4XPages

Elric

Well-Known Member
Licensed User
Ciao a tutti!

È possibile?

Da dove inizio?

Dovrei implementare in un BootReceiver una ricerca dentro un database SQL (o un file txt) se è impostato "True" o "False"?
 

LucaMs

Expert
Licensed User
Longtime User
Ciao a tutti!

È possibile?

Da dove inizio?

Dovrei implementare in un BootReceiver una ricerca dentro un database SQL (o un file txt) se è impostato "True" o "False"?
Ciao.

Non puoi condizionare l'avvio del BootReceiver da codice, è gestito da Android - in base al manifest file.

Però puoi condizionare ciò che viene eseguito all'interno di esso. Ovviamente al primo avvio non potrai farlo, perché l'utente dovrà poter usare il B4XSwitch ed a quel punto il receiver sarà già stato eseguito.

Ricorda che i receiver hanno vita molto breve, per cui non fargli eseguire operazioni lunghe (meglio stare entro i 5 secondi, direi).
 
Upvote 0

Elric

Well-Known Member
Licensed User
Avevo pensato una cosa del genere:
B4X:
' This method runs at boot if you have #ServiceStartAtBoot: True in ServiceAttributes
Sub Receiver_Receive (Enabled As Boolean, StartingIntent As Intent)
    Log("Receiver started")
 
    Dim mystrFileName As String = "StartAtBoot.txt"
    Dim mystrStartAtBoot As String
 
    ' Check If the File $“${mystrFileName}”$ exists in the internal directory of the Application (File.DirInternal).
    ' If the File exists, it reads all the File content as a string using File.ReadString and assigns it to the mystrStartAtBoot variable.
    ' If the file doesn’t exist, it assigns the string “False” to mystrStartAtBoot.
    mystrStartAtBoot = IIf(File.Exists(File.DirInternal, mystrFileName),File.ReadString(File.DirInternal, mystrFileName), $"False"$)
 
    ' Start the service at boot, without permission checks
    If mystrStartAtBoot = "True" Then
        StartService(sService)
    End If
End Sub
Ma non l'ho ancora testato.
 
Upvote 0

Elric

Well-Known Member
Licensed User
Grazie!
Ricorda anche che devi richiedere il permesso
Draw on other app
(O come cavolo si chiama).

*** EDIT ***
Questo
https://www.b4x.com/android/forum/threads/draw-on-top-of-other-apps-permission.90513/
Serve a poter aprire l'app da un service o un receiver.
Necessario da Android 10.
Leggo che il codice in quel link lo posso mettere anche in una classe a sé stante, bene.

In un app con B4XPages e un BootReceiver, il
B4X:
Wait For (c.GetPermission) Complete (Success As Boolean)
dove lo dovrei inserire?
Nel Main? E in quale sub?
In B4XMainPage? Alla creazione?
 
Upvote 0

LucaMs

Expert
Licensed User
Longtime User
Leggo che il codice in quel link lo posso mettere anche in una classe a sé stante, bene.
"puoi", "potresti" ma non è obbligatorio. Direi di semplificare la cosa e scrivere il codice direttamente nella B4XMainPage.

Se crei quella classe come nell'esempio, RequestDrawOverPermission, poi devi dichiarare una variabile (meglio privata) nella Process_Globals della B4XMainPage, inizializzarla (preferibilmente nella Sub Initialize della B4XMainPage stessa) e poi invocarne il metodo come in quell'esempio:
B4X:
' "c" è il pessimo nome della variabile di tipo RequestDrawOverPermission
Wait For (c.GetPermission) Complete (Success As Boolean)
praticamente quasi dove vuoi, in una btn_click, come nell'esempio, ma anche nella B4XPage_Appear o B4XPage_Created.

Comunque la cosa non mi è chiara affatto, dovrei "studiarla" almeno un po' (fino ad oggi non mi è interessato il "Draw on top of other apps") e in quel thread si parla di StartActivityForResult - ergo di Activities, ergo problema: i progetti B4XPages solitamente hanno un'unica Activity - ma non è vietato aggiungerne altre, è solo sconsigliabile.
 
Upvote 0

Sagenut

Expert
Licensed User
Longtime User
Secondo me conviene fare la richiesta dove ci sarà l'opzione per poter decidere lo start at boot.
Se l'app lo deve impostare di default richiedilo subito al primo avvio, magari preceduto da un msgbox che spieghi che quel permesso è necessario per quella funzione.
 
Upvote 0
Top