Obsługa interakcji użytkownika

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:

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<MainActivity>()
    )
}

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:

@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:

@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
        // ...
    }
}