Glance ช่วยให้การจัดการการโต้ตอบของผู้ใช้เป็นเรื่องง่ายขึ้นโดยใช้คลาส Action คลาส Action ของ Glance จะกำหนดการดำเนินการที่ผู้ใช้ทำได้ และคุณสามารถระบุการดำเนินการที่ทำเพื่อตอบสนองต่อการดำเนินการนั้นได้ คุณสามารถใช้ Action กับคอมโพเนนต์ใดก็ได้ด้วยเมธอด GlanceModifier.clickable
วิดเจ็ตแอปจะทำงานในกระบวนการระยะไกล ดังนั้นระบบจะกำหนดการดำเนินการ ณ เวลาที่สร้าง และการดำเนินการจะเกิดขึ้นในกระบวนการระยะไกล ใน RemoteViews แบบเนทีฟ
การดำเนินการนี้จะทำโดยใช้ PendingIntents
การดำเนินการต่อไปนี้จะอธิบายไว้ในหน้านี้
เปิดกิจกรรม
หากต้องการเปิดกิจกรรมเมื่อมีการโต้ตอบของผู้ใช้ ให้ระบุฟังก์ชัน actionStartActivity ให้กับ Button หรือ Composable อื่นๆ โดยใช้ตัวแก้ไข 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 สามารถใช้การดำเนินการ Lambda หรือ actionRunCallback เพื่อดำเนินการต่างๆ เช่น อัปเดต UI หรือสถานะในการโต้ตอบของผู้ใช้
เรียกใช้การดำเนินการ Lambda
คุณสามารถใช้ฟังก์ชัน Lambda เป็น Callback สำหรับการโต้ตอบกับ UI ได้
ตัวอย่างเช่น ส่งฟังก์ชัน Lambda ไปยังตัวแก้ไข GlanceModifier.clickable
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
หรือส่งไปยังพารามิเตอร์ onClick ใน Composable ที่รองรับ ดังนี้
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 // ... } }