Menangani interaksi pengguna

Glance menyederhanakan penanganan interaksi pengguna melalui class Action. Class Action Sekilas 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 aktif pada proses jarak jauh, sehingga tindakan ditentukan pada waktu pembuatan dan eksekusi terjadi dalam proses jarak jauh. Di RemoteViews native, hal ini dilakukan melalui PendingIntents.

Tindakan berikut dijelaskan di halaman ini:

Meluncurkan aktivitas

Untuk meluncurkan aktivitas pada interaksi pengguna, sediakan fungsi actionStartActivity ke Button atau composable lainnya melalui pengubah GlanceModifier.clickable(..).

Berikan salah satu hal berikut di actionStartActivity:

Glance menerjemahkan Action menjadi PendingIntent dengan target dan parameter yang disediakan. Pada contoh berikut, NavigationActivity diluncurkan saat pengguna mengklik tombol:

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

Meluncurkan layanan

Serupa 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 acara 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

Daripada meluncurkan target tertentu, Glance dapat menggunakan tindakan lambda atau actionRunCallback untuk melakukan tindakan, seperti mengupdate 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 untuk mengeksekusi logika yang ditentukan (yaitu meminta data refresh).

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

Menyediakan parameter untuk tindakan

Untuk memberikan informasi tambahan pada suatu tindakan, gunakan ActionParameters API 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 memungkinkan Aktivitas target mengambilnya.

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

Parameter juga disediakan 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
        // ...
    }
}