Nutzerinteraktionen verarbeiten

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:

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:

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

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