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:
- Die Zielaktivitätsklasse
- Die
ComponentName
- Einen Intent
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:
- Die Zielaktivitätsklasse
- Die
ComponentName
- Intent
@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:
- Stringaktion
- Die
ComponentName
- Intent
- Klasse
BroadcastReceiver
@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 // ... } }