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. Sie können den Vorgang angeben, der als Reaktion auf die Aktion ausgeführt wird. Sie können mit der Methode GlanceModifier.clickable einen Action auf jede Komponente anwenden.

App-Widgets befinden sich in einem Remote-Prozess. Die Aktionen werden also bei der Erstellung definiert und die Ausführung erfolgt im Remote-Prozess. In nativem RemoteViews erfolgt dies mit PendingIntents.

Die folgenden Aktionen werden auf dieser Seite beschrieben:

Aktivität starten

Wenn du eine Aktivität bei einer Nutzerinteraktion starten möchtest, übergib die Funktion actionStartActivity mit dem Modifikator GlanceModifier.clickable an ein Button oder ein anderes Compose-Element.

Geben Sie in actionStartActivity einen der folgenden Werte an:

Glance übersetzt die Aktion in ein 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 kannst du 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
        )
    )
}

Nachricht an alle senden

Senden Sie ein Broadcast-Ereignis bei 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 ein actionRunCallback verwenden, um eine Aktion auszuführen, z. B. die Benutzeroberfläche 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 in Composables übergeben, die dies unterstützen:

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

ActionCallback ausführen

Alternativ können Sie die actionRunCallback-Methoden verwenden, um eine Aktion bei einer Nutzerinteraktion auszuführen. Stellen Sie dazu eine benutzerdefinierte Implementierung von ActionCallback bereit:

@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 (d.h. die Aktualisierung der Daten wird angefordert).

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 angeben

Wenn Sie einer Aktion zusätzliche Informationen zur Verfügung stellen möchten, verwenden Sie die ActionParameters API, um ein typisiertes Schlüssel/Wert-Paar zu erstellen. 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() }
    }
}

Im Hintergrund werden die Parameter in den Intent aufgenommen, der zum Starten der Aktivität verwendet wird, damit 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 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
        // ...
    }
}