Nutzerinteraktionen verarbeiten

Glance vereinfacht die Verarbeitung von Nutzerinteraktionen über die Action-Klassen. Die Action-Klassen von Glance definieren die Aktionen, die ein Nutzer ausführen kann. Außerdem können Sie den Vorgang angeben, der als Reaktion auf die Aktion ausgeführt wird. Sie können ein Action mit der Methode GlanceModifier.clickable auf jede Komponente anwenden.

App-Widgets sind Teil eines Remote-Prozesses, sodass die Aktionen bei der Erstellung definiert und die Ausführung im Remote-Prozess erfolgt. In der nativen RemoteViews erfolgt dies über PendingIntents.

Auf dieser Seite werden die folgenden Aktionen beschrieben:

Aktivität starten

Um eine Aktivität zur Nutzerinteraktion zu starten, stellen Sie die Funktion actionStartActivity für eine Button oder eine andere zusammensetzbare Funktion über den GlanceModifier.clickable(..)-Modifikator bereit.

Geben Sie in actionStartActivity eine der folgenden Optionen an:

Glance übersetzt die Aktion in einen PendingIntent mit dem bereitgestellten Ziel und den Parametern. Im folgenden Beispiel wird NavigationActivity gestartet, wenn ein Nutzer auf die Schaltfläche klickt:

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

Dienst starten

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

Geben Sie in actionStartService eine der folgenden Optionen an:

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

Broadcast-Ereignis senden

Mit einer der actionSendBroadcast-Methoden kannst du bei Nutzerinteraktion ein Broadcast-Ereignis senden:

Geben Sie in actionSendBroadcast eine der folgenden Optionen 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 ein actionRunCallback verwenden, um eine Aktion auszuführen, z. B. die Aktualisierung der Benutzeroberfläche oder des Zustands bei einer Nutzerinteraktion.

Lambda-Aktionen ausführen

Du kannst Lambda-Funktionen als Callbacks für die Interaktionen mit der Benutzeroberfläche verwenden.

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

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

Alternativ können Sie ihn bei zusammensetzbaren Funktionen, die ihn 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 eine Nutzerinteraktion auszuführen. Dazu musst du eine benutzerdefinierte Implementierung von ActionCallback angeben:

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

Durch den Klick des Nutzers wird die Methode suspend onAction des bereitgestellten ActionCallback aufgerufen. Sie führt die definierte Logik aus (d. h., die Aktualisierungsdaten werden angefordert).

Wenn Sie das Widget nach Ausführung der Aktion aktualisieren möchten, erstellen Sie eine neue Instanz und rufen Sie update(...) auf. Weitere Informationen finden Sie im Abschnitt GlanceAppWidget-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 einer Aktion zusätzliche Informationen zur Verfügung stellen möchten, erstellen Sie mit der ActionParameters API ein typisiertes Schlüssel/Wert-Paar. So definieren Sie beispielsweise das angeklickte 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 in dem Intent enthalten, der zum Starten der Aktivität verwendet wird, sodass sie von der Zielaktivität abgerufen werden 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 den 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
        // ...
    }
}