จัดการการโต้ตอบของผู้ใช้

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

@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
        // ...
    }
}