Menangani interaksi pengguna

Glance menyederhanakan penanganan interaksi pengguna menggunakan class Action. Class Action Glance menentukan tindakan yang dapat dilakukan pengguna, dan Anda dapat menentukan operasi yang dilakukan sebagai respons terhadap tindakan tersebut. Anda dapat menerapkan Action ke komponen mana pun dengan metode GlanceModifier.clickable.

Widget aplikasi berada di proses jarak jauh, sehingga tindakan ditentukan pada waktu pembuatan dan eksekusi terjadi di proses jarak jauh. Di RemoteViews native, hal ini dilakukan menggunakan PendingIntents.

Tindakan berikut dijelaskan di halaman ini:

Meluncurkan aktivitas

Untuk meluncurkan aktivitas saat interaksi pengguna, berikan fungsi actionStartActivity ke Button atau composable lain menggunakan pengubah GlanceModifier.clickable.

Berikan salah satu hal berikut dalam actionStartActivity:

Glance menerjemahkan Tindakan menjadi PendingIntent dengan target dan parameter yang diberikan. Dalam contoh berikut, NavigationActivity diluncurkan saat pengguna mengklik tombol:

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

Meluncurkan layanan

Mirip dengan meluncurkan aktivitas, luncurkan layanan saat interaksi pengguna menggunakan salah satu metode actionStartService.

Berikan salah satu hal berikut dalam actionStartService:

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

Mengirim acara siaran

Kirim peristiwa siaran saat interaksi pengguna menggunakan salah satu metode actionSendBroadcast:

Berikan salah satu hal berikut dalam actionSendBroadcast:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Send",
        onClick = actionSendBroadcast<MyReceiver>()
    )
}

Melakukan tindakan kustom

Alih-alih meluncurkan target tertentu, Glance dapat menggunakan tindakan lambda atau actionRunCallback untuk melakukan tindakan, seperti memperbarui UI atau status saat interaksi pengguna.

Menjalankan tindakan lambda

Anda dapat menggunakan fungsi lambda sebagai callback ke interaksi UI.

Misalnya, teruskan fungsi lambda ke pengubah GlanceModifier.clickable:

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

Atau, teruskan ke parameter onClick pada composable yang mendukungnya:

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

Menjalankan ActionCallback

Atau, gunakan metode actionRunCallback untuk melakukan tindakan pada interaksi pengguna. Untuk melakukannya, berikan implementasi kustom dari ActionCallback:

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

Saat pengguna mengklik, metode suspend onAction dari ActionCallback yang diberikan akan dipanggil, yang menjalankan logika yang ditentukan (yaitu, meminta data yang dimuat ulang).

Untuk memperbarui widget setelah tindakan dilakukan, buat instance baru dan panggil update(..). Untuk mengetahui detail selengkapnya, lihat bagian Mengelola status GlanceAppWidget.

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

Memberikan parameter ke tindakan

Untuk memberikan informasi tambahan ke tindakan, gunakan ActionParameters API untuk membuat pasangan nilai kunci yang diketik. Misalnya, untuk menentukan tujuan yang diklik:

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() }
    }
}

Di bawahnya, parameter disertakan dalam intent yang digunakan untuk meluncurkan aktivitas, sehingga Aktivitas target dapat mengambilnya.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val destination = intent.extras?.getString(KEY_DESTINATION) ?: return
        // ...
    }
}

Parameter juga diberikan ke ActionCallback. Gunakan Parameters.Key yang ditentukan untuk mengambil nilai:

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