Glance vereinfacht die Verarbeitung von Nutzerinteraktionen mithilfe der Action-Klassen. Die Action-Klassen von Glance definieren die Aktionen, die ein Nutzer ausführen kann, und Sie können die Operation angeben, die als Reaktion auf die Aktion ausgeführt wird. Sie können ein Action auf jede
Komponente mit der GlanceModifier.clickable Methode anwenden.
App-Widgets werden in einem Remote-Prozess ausgeführt. Die Aktionen werden daher bei der Erstellung definiert und die Ausführung erfolgt im Remote-Prozess. In nativen RemoteViews geschieht dies mit PendingIntents.
Auf dieser Seite werden die folgenden Aktionen beschrieben:
Aktivität starten
Wenn Sie eine Aktivität bei einer Nutzerinteraktion starten möchten, stellen Sie die
actionStartActivity Funktion einem Button oder einer anderen zusammensetzbaren Funktion mit dem
GlanceModifier.clickable Modifikator zur Verfügung.
Geben Sie in actionStartActivity einen der folgenden Werte an:
- Die Zielaktivitätsklasse
- Die
ComponentName - Ein Intent
Glance übersetzt die Aktion in einen PendingIntent mit dem angegebenen Ziel und den angegebenen Parametern. Im folgenden Beispiel wird die NavigationActivity gestartet, wenn ein 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 können Sie einen Dienst bei einer Nutzerinteraktion mit einer
der actionStartService-Methoden starten.
Geben Sie in actionStartService einen der folgenden Werte an:
- Die Zielaktivitätsklasse
- Die
ComponentName - Ein Intent
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
Übertragungsereignis senden
Senden Sie ein Übertragungsereignis bei einer Nutzerinteraktion mit einer der
actionSendBroadcast-Methoden:
Geben Sie in actionSendBroadcast einen der folgenden Werte an:
- String-Aktion
- Die
ComponentName - Ein Intent
BroadcastReceiver-Klasse
@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 actionRunCallback verwenden, um eine Aktion auszuführen, z. B. die UI oder den Status bei einer Nutzerinteraktion zu aktualisieren.
Lambda-Aktionen ausführen
Sie können Lambda-Funktionen als Callbacks für die UI-Interaktionen verwenden.
Übergeben Sie die Lambda-Funktion beispielsweise an den Modifikator GlanceModifier.clickable:
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
Alternativ können Sie sie an den Parameter onClick für zusammensetzbare Funktionen übergeben, die ihn unterstützen:
Button( text = "Submit", onClick = { submitData() } )
ActionCallback ausführen
Alternativ können Sie die actionRunCallback Methoden verwenden, um bei einer
Nutzerinteraktion eine Aktion auszuführen. Dazu müssen Sie eine benutzerdefinierte Implementierung von der
ActionCallback bereitstellen:
@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 } }
Wenn der Nutzer klickt, wird die Methode suspend onAction des bereitgestellten ActionCallback aufgerufen und die definierte Logik ausgeführt (z.B. Aktualisierungsdaten anfordern).
Wenn Sie das Widget nach der 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 bereitstellen
Wenn Sie einer Aktion zusätzliche Informationen hinzufügen möchten, verwenden Sie die ActionParameters
-API, um ein typisiertes Schlüssel/Wert-Paar zu erstellen. Beispiel zum Definieren des angeklickten Ziels:
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() } } }
Die Parameter sind im Intent enthalten, der zum Starten der Aktivität verwendet wird, 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 an ActionCallback übergeben. 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 // ... } }