Nutzerinteraktionen verarbeiten

Glance vereinfacht die Verarbeitung von Nutzerinteraktionen über die Action-Klassen. Glance's Action-Klassen definieren die Aktionen, die ein Nutzer ausführen kann, und Sie können die -Vorgang als Reaktion auf die Aktion ausgeführt wird. Sie können Action auf alle mit der Methode GlanceModifier.clickable.

App-Widgets befinden sich in einem Remote-Prozess, sodass die Aktionen bei der Erstellung definiert werden und die Ausführung erfolgt im Remote-Prozess. In der nativen Datei RemoteViews Dies erfolgt über PendingIntents.

Auf dieser Seite werden die folgenden Aktionen beschrieben:

Aktivität starten

Um eine Aktivität zur Nutzerinteraktion zu starten, geben Sie die actionStartActivity-Funktion in eine Button oder eine andere zusammensetzbare Funktion über die GlanceModifier.clickable(..)-Modifikator.

Geben Sie eines der folgenden Dokumente in actionStartActivity an:

Glance die Aktion in ein PendingIntent mit dem angegebenen Ziel und Parameter. Im folgenden Beispiel wird NavigationActivity gestartet, wenn ein der Nutzer auf die Schaltfläche klickt:

@Composable
fun MyContent() {
    // ..
    Button(
        text = "Go Home",
        onClick = actionStartActivity<MyActivity>()
    )
}

Dienst starten

Ähnlich wie beim Starten einer Aktivität starten Sie einen Dienst mit einer der actionStartService-Methoden.

Geben Sie eines der folgenden Dokumente in actionStartService an:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Sync",
        onClick = actionStartService<SyncService>(
            isForegroundService = true // define how the service is launched
        )
    )
}

Ereignis an alle senden

Senden Sie bei einer Nutzerinteraktion ein Übertragungsereignis mit einer der actionSendBroadcast-Methoden:

Geben Sie eines der folgenden Dokumente in actionSendBroadcast an:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Send",
        onClick = actionSendBroadcast<MyReceiver>()
    )
}

Benutzerdefinierte Aktionen ausführen

Anstatt ein bestimmtes Ziel zu starten, kann Glance eine Lambda-Aktion oder eine actionRunCallback, um eine Aktion auszuführen, z. B. die Benutzeroberfläche oder den Status zu aktualisieren der Nutzerinteraktion.

Lambda-Aktionen ausführen

Sie können Lambda-Funktionen als Callbacks für die UI-Interaktionen verwenden.

Übergeben Sie beispielsweise die Lambda-Funktion an die GlanceModifier.clickable Modifikator:

Text(
    text = "Submit",
    modifier = GlanceModifier.clickable {
        submitData()
    }
)

Alternativ können Sie sie bei zusammensetzbaren Funktionen, die sie unterstützen, an den Parameter onClick übergeben:

Button(
    text = "Submit",
    onClick = {
        submitData()
    }
)

ActionCallback ausführen

Alternativ können Sie die actionRunCallback-Methoden verwenden, um eine Aktion für der Nutzerinteraktion. Stellen Sie dazu eine benutzerdefinierte Implementierung des 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
    }
}

Beim Klicken des Nutzers wird die suspend onAction-Methode der bereitgestellten ActionCallback wird aufgerufen, wodurch die definierte Logik ausgeführt wird (d.h. Daten aktualisieren).

Um das Widget nach dem Ausführen der Aktion zu aktualisieren, erstellen Sie eine neue Instanz und Aufruf von update(..). Weitere Informationen finden Sie unter LookAppWidget-Status verwalten. .

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

Parameter für Aktionen angeben

Wenn Sie zusätzliche Informationen zu einer Aktion angeben möchten, verwenden Sie den ActionParameters. Die API zum Erstellen eines typisierten Schlüssel/Wert-Paars. Um beispielsweise die angeklickten Ziel:

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

Darunter sind die Parameter im Intent enthalten, mit dem die -Aktivität, sodass die Zielaktivität sie abrufen kann.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val destination = intent.extras?.getString(KEY_DESTINATION) ?: return
        // ...
    }
}

Die Parameter werden auch für ActionCallback bereitgestellt. Verwenden Sie die definierten Parameters.Key, um den Wert abzurufen:

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