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

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

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