Menangani interaksi pengguna

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

Widget aplikasi aktif pada proses jarak jauh, sehingga tindakan ditentukan saat pembuatan waktu dan eksekusinya 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 ke PendingIntent dengan target yang diberikan dan parameter. Pada 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 satu dari 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

Mengirim 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

Sebagai ganti meluncurkan target tertentu, Glance dapat menggunakan tindakan lambda atau actionRunCallback untuk melakukan tindakan, seperti mengupdate UI atau status di interaksi pengguna.

Menjalankan tindakan lambda

Anda dapat menggunakan fungsi lambda sebagai callback untuk interaksi UI.

Misalnya, teruskan fungsi lambda ke GlanceModifier.clickable pengubah:

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, sediakan 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 yang disediakan ActionCallback dipanggil untuk mengeksekusi logika yang ditentukan (yaitu, meminta memperbarui data).

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

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 untuk tindakan

Untuk memberikan informasi tambahan pada tindakan, gunakan ActionParameters API untuk membuat pasangan nilai kunci yang diketik. Misalnya, untuk mendefinisikan klik tujuan:

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 Anda, 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 atribut Parameters.Key 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
        // ...
    }
}