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

ข้อมูลโดยย่อจะลดความซับซ้อนในการจัดการการโต้ตอบของผู้ใช้ผ่านชั้นเรียน Action ข้อมูลโดยย่อ คลาส Action จะกำหนดสิ่งที่ผู้ใช้สามารถทำได้ และคุณสามารถระบุ ดำเนินการเพื่อตอบสนองต่อการทำงานนั้น คุณสามารถใช้ Action กับ โดยใช้เมธอด GlanceModifier.clickable

วิดเจ็ตแอปทำงานบนกระบวนการระยะไกล ดังนั้นจึงมีการกำหนดการดำเนินการขณะสร้าง และการดำเนินการจะเกิดขึ้นในกระบวนการระยะไกล ในเนทีฟ RemoteViews ซึ่งดำเนินการผ่าน PendingIntents

มีการอธิบายการดำเนินการต่อไปนี้ในหน้านี้

เปิดกิจกรรม

หากต้องการเปิดกิจกรรมการโต้ตอบของผู้ใช้ ให้ระบุ actionStartActivity ไปยัง Button หรือ Composable อื่นผ่านพารามิเตอร์ GlanceModifier.clickable(..) ตัวปรับแต่ง

ระบุข้อใดข้อหนึ่งต่อไปนี้ใน actionStartActivity

  • คลาสกิจกรรมเป้าหมาย
  • ComponentName
  • ความตั้งใจ

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 เป็นการเรียกกลับในการโต้ตอบกับ 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
        // ...
    }
}