Italian Widget applicazione

Fulvio75

Well-Known Member
Licensed User
Ciao ho un problema con un widget che ho creato con il codice come da tutorial:
B4X:
#Region  Service Attributes
    #StartAtBoot: False
   
#End Region

Sub Process_Globals

    Private RV As RemoteViews

End Sub

Sub Service_Create

    RV = ConfigureHomeWidget("layAppWidget1080", "RV", 0, "test",True)

End Sub

Sub Service_Start (StartingIntent As Intent)
 
    If RV.HandleWidgetEvents(StartingIntent) Then Return
    Sleep(0)
    Service.StopAutomaticForeground
   
End Sub

Sub RV_RequestUpdate
   
    LoadWidgetData
    RV.UpdateWidget
   
End Sub

Sub RV_Disabled
   
    StopService("")
   
End Sub

Sub LoadWidgetData
   
   
  
End Sub

Sub Service_Destroy

   
End Sub

l'applicazione funziona bene fino a quando non visualizzo il widget poi se non inserisco il codice seguente:

Sleep(0)
Service.StopAutomaticForeground

nella Sub Service_Start (StartingIntent As Intent)

al primo avvio dell'applicazione con widget visualizzato si avvia normalmente, al secondo avvio viene visualizzato lo schermo nero con i tasti android back menu ecc... e l'applicazione non si apre, mettendo il codice sopra menzionato la situazione migliora nel senso che il problema all'avviamento si ripete sporadicamente.
In oltre ho notato che quando l'app non parte (schermo nero) se faccio lo svuotamento della Cache poi al riavvio dell'applicazione questa parte e il problema si ripresenta dopo un po di tempo.
A cosa è dovuto?
Grazie
 

Sagenut

Expert
Licensed User
Longtime User
Ho fatto solo una piccola prova con i widget quindi non li conosco bene.
Perchè hai
B4X:
If RV.HandleWidgetEvents(StartingIntent) Then Return
mentre io nel mio esempio ho
B4X:
RV.HandleWidgetEvents(StartingIntent)
???
E' una domanda ma potrebbe anche essere una risposta. ;)
 

Fulvio75

Well-Known Member
Licensed User
Ho fatto solo una piccola prova con i widget quindi non li conosco bene.
Perchè hai
B4X:
If RV.HandleWidgetEvents(StartingIntent) Then Return
mentre io nel mio esempio ho
B4X:
RV.HandleWidgetEvents(StartingIntent)
???
E' una domanda ma potrebbe anche essere una risposta. ;)
Booo... L'ho copiato dall'esempio 😁
 

Fulvio75

Well-Known Member
Licensed User
Ho litigato con i widget (un widget) solo per prova, più o meno nel 1492.
Non so da quale esempio tu abbia copiato, ma sto guardando il tutorial di Erel e nel suo codice non è così.
Segui quello (se hai ancora problemi e non hai già risolto).
Leggi tutto che lo vedi... Dopo il codice di esempio
 

Fulvio75

Well-Known Member
Licensed User
Il bello è che questo problema l'ho da sullo Xiaomi nuovo mentre su Android vecchi no
 

LucaMs

Expert
Licensed User
Longtime User
B4X:
Sub Service_Start (StartingIntent As Intent)
    If rv.HandleWidgetEvents(StartingIntent) Then Return
End Sub
The above code checks the Intent message that caused this service to start and is responsible for raising the events related to the widget. It returns true if an event was raised.
In effetti non capisco granché quel codice e quella spiegazione.
Ammesso che quell'istruzione (sarà certamente così) vada a verficare se uno dei due eventi sia scattato, scrivere il solo Return a cosa serve? Mah.
Di norma, si dice che in quel modo l'evento venga "consumato". Mah 2, la vendetta.
 

LucaMs

Expert
Licensed User
Longtime User
In effetti non capisco granché quel codice e quella spiegazione.
Ammesso che quell'istruzione (sarà certamente così) vada a verficare se uno dei due eventi sia scattato, scrivere il solo Return a cosa serve? Mah.
Di norma, si dice che in quel modo l'evento venga "consumato". Mah 2, la vendetta.
... e nella seconda parte del tutorial (altro thread) non esegue quella verifica né quindi quel Return.
 

Fulvio75

Well-Known Member
Licensed User
boooo… provo a eliminarlo.
Ti spiego… visualizzo il widget sullo schermo, apro l'appplicazione e questa si avvia normalmente.
Chiudo l'applicazione sempre con il widget visualizzato, riapro l'applicazione e schermo nero, non si avvia.
Se metto quel codice sleep(0) e Service.StopAutomaticForeground l'applicazione si blocca di meno ma qualche volta lo fa ugualmente, ora provo a togliere il return
 

Fulvio75

Well-Known Member
Licensed User
ecco a cosa serve
1584520462499.png
 

LucaMs

Expert
Licensed User
Longtime User
Sì, l'ho letto, è ciò che è riportato nel tutorial, ma "consumare l'evento "Activity_Start"... non so quale sia il motivo.

Comunque, non credo sia il tuo problema, visto che nel primo esempio quel controllo (quella verifica) c'è e nel secondo no.
 

Fulvio75

Well-Known Member
Licensed User
Ora l'ho tolto devo provare prima c'era.
Altra domanda…:rolleyes:
per aprire l'app cliccando sul widget??
per ridimensionare il widget a seconda del telefono?? ora ho disegnato un widget con width=860 che va bene per il mio telefono, se però cambio telefono il widget non si vede tutto è tagliato perché il display è più piccolo, il widget supporta solo l'ancoraggio a sinistra l'auto adattamento no
 

LucaMs

Expert
Licensed User
Longtime User
per aprire l'app cliccando sul widget??
(ripeto che provai a creare solo un widget proprio agli inizi, 7 anni fa, più o meno, quindi esperienza praticamente nulla).

A quanto ho capito, devi scrivere nel modulo di servizio gli eventi delle view che compongono il layout del widget.
All'interno di uno di questi potresti provare ad eseguire un CallSubDelayed(Main, "NomeDiUnaRoutineNelMain")


per ridimensionare il widget a seconda del telefono??
Questo è lo scoglio principale sul quale si è incagliato @Sagenut e credo non abbia ancora risolto.
 

Fulvio75

Well-Known Member
Licensed User
(ripeto che provai a creare solo un widget proprio agli inizi, 7 anni fa, più o meno, quindi esperienza praticamente nulla).

A quanto ho capito, devi scrivere nel modulo di servizio gli eventi delle view che compongono il layout del widget.
All'interno di uno di questi potresti provare ad eseguire un CallSubDelayed(Main, "NomeDiUnaRoutineNelMain")



Questo è lo scoglio principale sul quale si è incagliato @Sagenut e credo non abbia ancora risolto.

ok 1000 widget per ogni telefono… meno male che lo uso solo sul mio
 

LucaMs

Expert
Licensed User
Longtime User
e se giro a Erel il link di questa discussione?? risponde?:p
Uhm... non so, a volte capita qui, ma è chiaro che deve litigare con l'italiano.


A quanto ho capito, devi scrivere nel modulo di servizio gli eventi delle view che compongono il layout del widget.
All'interno di uno di questi potresti provare ad eseguire un CallSubDelayed(Main, "NomeDiUnaRoutineNelMain")
Ho provato (tentando di aprire un'altra Activity, non la Main) ma niente da fare, non l'apre.
 

Sagenut

Expert
Licensed User
Longtime User
B4X:
Sub Label1_Click
    StartActivity(Main)
End Sub
Chiaramente devi creare una sub per ogni view che vuoi che apra l'app e dovrai mettere il nome giusto della Activity che vuoi.
Và messo nel servizio del widget ovviamente.
 
Top