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
:
- Class aktivitas target
ComponentName
- Intent
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<MyActivity>() ) }
Meluncurkan layanan
Serupa 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 acara 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
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 // ... } }