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