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:
- Class aktivitas target
ComponentName- Intent
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:
- Class aktivitas target
ComponentName- Intent
@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:
- Tindakan string
ComponentName- Intent
- Class
BroadcastReceiver
@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 // ... } }