Funkcja Glance upraszcza obsługę interakcji użytkowników dzięki klasom Action
. Klasy Action
w Glance określają działania, które może wykonywać użytkownik. Możesz też określić operację wykonaną w odpowiedzi na działanie. Za pomocą metody GlanceModifier.clickable
możesz zastosować właściwość Action
do dowolnego komponentu.
Widżety aplikacji działają zdalnie, co oznacza, że działania są definiowane w momencie tworzenia, a wykonywane w procesie zdalnym. W natywnej lokalizacji RemoteViews
odbywa się to za pomocą PendingIntents
.
Na tej stronie opisano te działania:
Uruchamianie aktywności
Aby uruchomić działanie związane z interakcją użytkownika, podaj funkcję actionStartActivity
do elementu Button
lub innego elementu kompozycyjnego za pomocą modyfikatora GlanceModifier.clickable
(..).
Podaj w polu actionStartActivity
jedną z tych wartości:
- Docelowa klasa aktywności
ComponentName
- Zamiar
Funkcja Glance przekształca akcję na PendingIntent
przy użyciu podanych wartości docelowych i parametrów. W poniższym przykładzie interfejs NavigationActivity
jest uruchamiany, gdy użytkownik kliknie przycisk:
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
Uruchamianie usługi
Podobnie jak w przypadku uruchamiania działania, uruchom usługę w odpowiedzi na interakcję użytkownika za pomocą jednej z metod actionStartService
.
Podaj w polu actionStartService
jedną z tych wartości:
- Docelowa klasa aktywności
ComponentName
- Zamiar
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
Wyślij wydarzenie z transmisją
Wyślij transmisję zdarzenia związanego z interakcją z użytkownikiem, korzystając z jednej z tych metod actionSendBroadcast
:
Podaj w polu actionSendBroadcast
jedną z tych wartości:
- Działanie na ciągu znaków
ComponentName
- Zamiar
BroadcastReceiver
zajęcia
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
Wykonywanie działań niestandardowych
Zamiast uruchamiać konkretny cel, Glance może użyć działania lambda lub obiektu actionRunCallback
, aby wykonać działanie, takie jak aktualizacja interfejsu lub stanu interakcji użytkownika.
Uruchom działania lambda
Funkcji lambda możesz używać jako wywołań zwrotnych do interakcji z interfejsem.
Na przykład przekaż funkcję lambda do modyfikatora GlanceModifier.clickable
:
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
Możesz też przekazać go do parametru onClick
w elementach kompozycyjnych, które go obsługują:
Button( text = "Submit", onClick = { submitData() } )
Uruchom wywołanie zwrotne do działania
Możesz też użyć metod actionRunCallback
, aby wykonać działanie na podstawie interakcji użytkownika. Aby to zrobić, udostępnij niestandardową implementację interfejsu ActionCallback
:
@Composable private fun MyContent() { // .. Image( provider = ImageProvider(R.drawable.ic_hourglass_animated), modifier = GlanceModifier.clickable( onClick = actionRunCallback<RefreshAction>() ), contentDescription = "Refresh" ) } class RefreshAction : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { // TODO implement } }
Kliknięcie przez użytkownika powoduje wywołanie metody suspend onAction
podanego elementu ActionCallback
, która wykonuje zdefiniowaną logikę (np. żądanie odświeżania danych).
Aby zaktualizować widżet po wykonaniu działania, utwórz nową instancję i wywołaj update
(..). Więcej informacji znajdziesz w sekcji Zarządzanie stanem GlanceAppWidget.
class RefreshAction : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { // do some work but offset long-term tasks (e.g a Worker) MyAppWidget().update(context, glanceId) } }
Podawanie parametrów działań
Aby podać dodatkowe informacje o działaniu, utwórz podaną parę klucz-wartość za pomocą interfejsu API ActionParameters
. Aby np. zdefiniować kliknięte miejsce docelowe:
private val destinationKey = ActionParameters.Key<String>( NavigationActivity.KEY_DESTINATION ) class MyAppWidget : GlanceAppWidget() { // .. @Composable private fun MyContent() { // .. Button( text = "Home", onClick = actionStartActivity<NavigationActivity>( actionParametersOf(destinationKey to "home") ) ) Button( text = "Work", onClick = actionStartActivity<NavigationActivity>( actionParametersOf(destinationKey to "work") ) ) } override suspend fun provideGlance(context: Context, id: GlanceId) { provideContent { MyContent() } } }
Poniżej znajdują się parametry umieszczone w intencji używanej do uruchomienia działania, dzięki czemu aktywność docelowa może ją pobrać.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val destination = intent.extras?.getString(KEY_DESTINATION) ?: return // ... } }
Te parametry są też przekazywane do interfejsu ActionCallback
. Użyj zdefiniowanego elementu Parameters.Key
, aby pobrać wartość:
class RefreshAction : ActionCallback { private val destinationKey = ActionParameters.Key<String>( NavigationActivity.KEY_DESTINATION ) override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { val destination: String = parameters[destinationKey] ?: return // ... } }