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 apa pun dengan metode GlanceModifier.clickable.

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

Tindakan berikut dijelaskan di halaman ini:

Meluncurkan aktivitas

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

Berikan salah satu hal berikut di actionStartActivity:

Glance menerjemahkan Action menjadi PendingIntent dengan target dan parameter yang disediakan. 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 pada interaksi pengguna menggunakan salah satu metode actionStartService.

Berikan salah satu hal berikut di actionStartService:

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

Mengirim peristiwa siaran

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

Berikan salah satu hal berikut di 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 pada interaksi pengguna.

Menjalankan tindakan lambda

Anda dapat menggunakan fungsi lambda sebagai callback untuk 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 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 disediakan akan dipanggil, yang menjalankan logika yang ditentukan (yaitu, meminta data muat ulang).

Untuk mengupdate 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 API ActionParameters untuk membuat key-value pair 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
        // ...
    }
}