Glance upraszcza obsługę interakcji użytkownika za pomocą klas Action. Klasy Action w Glance określają działania, które może wykonać użytkownik, a Ty możesz określić operację wykonywaną w odpowiedzi na to działanie. Za pomocą metody GlanceModifier.clickable możesz zastosować Action do dowolnego
komponentu.
Widżety aplikacji działają w procesie zdalnym, więc działania są definiowane w momencie tworzenia, a ich wykonanie następuje w procesie zdalnym. W natywnych RemoteViews odbywa się to za pomocą PendingIntents.
Na tej stronie opisujemy te działania:
- Uruchamianie aktywności
- Uruchamianie usługi
- Wysyłanie zdarzenia transmisji
- Uruchamianie wywołania zwrotnego
Uruchamianie aktywności
Aby uruchomić aktywność w wyniku interakcji użytkownika, przekaż funkcję
actionStartActivity do Button lub innego elementu kompozycyjnego za pomocą modyfikatora
GlanceModifier.clickable.
W funkcji actionStartActivity podaj jedną z tych wartości:
- klasę docelowej aktywności,
ComponentName- intencję.
Glance tłumaczy działanie na PendingIntent z podanym celem i parametrami. W tym przykładzie po kliknięciu przycisku przez użytkownika uruchamia się NavigationActivity:
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
Uruchamianie usługi
Podobnie jak w przypadku uruchamiania aktywności, uruchom usługę w wyniku interakcji użytkownika za pomocą jednej
z metod actionStartService.
W funkcji actionStartService podaj jedną z tych wartości:
- klasę docelowej aktywności,
ComponentName- intencję.
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
Wysyłanie zdarzenia transmisji
Wyślij zdarzenie transmisji w wyniku interakcji użytkownika za pomocą jednej z
actionSendBroadcast metod:
W funkcji actionSendBroadcast podaj jedną z tych wartości:
- działanie w postaci ciągu znaków,
ComponentName- intencję,
BroadcastReceiverzaję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 actionRunCallback, aby wykonać działanie, np. zaktualizować interfejs lub stan w wyniku interakcji użytkownika.
Uruchamianie działań 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ć ją do parametru onClick w elementach kompozycyjnych, które go obsługują:
Button( text = "Submit", onClick = { submitData() } )
Uruchamianie ActionCallback
Możesz też użyć metod actionRunCallback, aby wykonać działanie w wyniku interakcji użytkownika. Aby to zrobić, podaj niestandardową implementację
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 } }
Gdy użytkownik kliknie, wywoływana jest metoda suspend onAction podanego ActionCallback, która wykonuje zdefiniowaną logikę (np. żąda odświeżenia 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) } }
Przekazywanie parametrów do działań
Aby przekazać dodatkowe informacje do działania, użyj ActionParameters
API, aby utworzyć parę klucz-wartość z typem. Na przykład, aby 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() } } }
Parametry są dołączane do intencji używanej do uruchamiania aktywności, co umożliwia docelowej aktywności ich pobranie.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val destination = intent.extras?.getString(KEY_DESTINATION) ?: return // ... } }
Parametry są też przekazywane do ActionCallback. Aby pobrać wartość, użyj zdefiniowanego Parameters.Key:
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 // ... } }