Glance ช่วยให้การจัดการการโต้ตอบของผู้ใช้ง่ายขึ้นโดยใช้คลาส Action คลาส Action ของ Glance จะกำหนดการดำเนินการที่ผู้ใช้ทำได้ และคุณสามารถระบุการดำเนินการที่จะเกิดขึ้นเพื่อตอบสนองต่อการดำเนินการนั้นๆ ได้ คุณสามารถใช้ Action กับคอมโพเนนต์ใดก็ได้ด้วยเมธอด GlanceModifier.clickable
วิดเจ็ตของแอปจะทำงานในกระบวนการระยะไกล ดังนั้นการดำเนินการจึงได้รับการกำหนดไว้ในตอนที่สร้าง และการดำเนินการจะเกิดขึ้นในกระบวนการระยะไกล ใน RemoteViews แบบเนทีฟ จะดำเนินการโดยใช้ PendingIntents
การดำเนินการต่อไปนี้อธิบายไว้ในหน้านี้
เปิดกิจกรรม
หากต้องการเปิดกิจกรรมเมื่อมีการโต้ตอบของผู้ใช้ ให้ระบุฟังก์ชัน
actionStartActivity ให้กับ Button หรือคอมโพสได้อื่นๆ โดยใช้ตัวปรับแต่ง
GlanceModifier.clickable
ระบุรายการใดรายการหนึ่งต่อไปนี้ใน actionStartActivity
- คลาสกิจกรรมเป้าหมาย
ComponentName- Intent
Glance จะแปลการดำเนินการเป็น PendingIntent ที่มีเป้าหมายและพารามิเตอร์ที่ระบุ ในตัวอย่างต่อไปนี้ ระบบจะเปิด NavigationActivity เมื่อผู้ใช้คลิกปุ่ม
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
เปิดบริการ
เปิดบริการเมื่อผู้ใช้โต้ตอบโดยใช้วิธีการหนึ่ง
ใน actionStartService วิธี ซึ่งคล้ายกับการเปิดกิจกรรม
ระบุรายการใดรายการหนึ่งต่อไปนี้ใน actionStartService
- คลาสกิจกรรมเป้าหมาย
ComponentName- Intent
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
ส่งกิจกรรมออกอากาศ
ส่งกิจกรรมออกอากาศเมื่อมีการโต้ตอบของผู้ใช้โดยใช้วิธีการ
actionSendBroadcast วิธีใดวิธีหนึ่ง
ระบุรายการใดรายการหนึ่งต่อไปนี้ใน actionSendBroadcast
- การดำเนินการสตริง
ComponentName- Intent
BroadcastReceiverชั้นเรียน
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
ดำเนินการที่กำหนดเอง
แทนที่จะเปิดเป้าหมายที่เฉพาะเจาะจง Glance สามารถใช้การดำเนินการแลมบ์ดาหรือ actionRunCallback เพื่อดำเนินการ เช่น อัปเดต UI หรือสถานะเมื่อผู้ใช้โต้ตอบ
เรียกใช้การดำเนินการแลมบ์ดา
คุณสามารถใช้ฟังก์ชันแลมบ์ดาเป็นการเรียกกลับสำหรับการโต้ตอบ UI
ตัวอย่างเช่น ส่งฟังก์ชันแลมบ์ดาไปยังตัวปรับแต่ง GlanceModifier.clickable ดังนี้
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
หรือส่งไปยังพารามิเตอร์ onClick ในคอมโพสได้ที่รองรับ ดังนี้
Button( text = "Submit", onClick = { submitData() } )
เรียกใช้ ActionCallback
หรือใช้วิธีการ actionRunCallback เพื่อดำเนินการเมื่อผู้ใช้โต้ตอบ
โดยระบุการใช้งานที่กำหนดเองของ
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 } }
เมื่อผู้ใช้คลิก ระบบจะเรียกใช้เมธอด suspend onAction ของ ActionCallback ที่ระบุ ซึ่งจะดำเนินการตามตรรกะที่กำหนดไว้ (เช่น ขอข้อมูลรีเฟรช)
หากต้องการอัปเดตวิดเจ็ตหลังจากดำเนินการแล้ว ให้สร้างอินสแตนซ์ใหม่และ
เรียกใช้ update(..) ดูรายละเอียดเพิ่มเติมได้ที่ส่วนจัดการสถานะ 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) } }
ระบุพารามิเตอร์สำหรับการดำเนินการ
หากต้องการระบุข้อมูลเพิ่มเติมสำหรับการดำเนินการ ให้ใช้ ActionParameters
API เพื่อสร้างคู่คีย์-ค่าที่มีการพิมพ์ เช่น หากต้องการกำหนดปลายทางที่คลิก
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() } } }
ระบบจะรวมพารามิเตอร์ไว้ใน Intent ที่ใช้เปิดกิจกรรม ซึ่งช่วยให้กิจกรรมเป้าหมายดึงข้อมูลดังกล่าวได้
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val destination = intent.extras?.getString(KEY_DESTINATION) ?: return // ... } }
นอกจากนี้ ระบบยังระบุพารามิเตอร์ให้กับ ActionCallback ด้วย ใช้ Parameters.Key ที่กำหนดไว้เพื่อดึงค่า
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 // ... } }