Xử lý tương tác của người dùng

Glance đơn giản hoá việc xử lý hoạt động tương tác của người dùng bằng các lớp Action. Các lớp Action của Glance xác định những thao tác mà người dùng có thể thực hiện và bạn có thể chỉ định thao tác được thực hiện để phản hồi thao tác đó. Bạn có thể áp dụng Action cho bất kỳ thành phần nào bằng phương thức GlanceModifier.clickable.

Tiện ích ứng dụng hoạt động trên một quy trình từ xa, vì vậy, các hành động được xác định tại thời điểm tạo và quá trình thực thi diễn ra trong quy trình từ xa. Trong RemoteViews gốc, việc này được thực hiện bằng PendingIntents.

Các thao tác sau đây được mô tả trên trang này:

Bắt đầu một hoạt động

Để chạy một Hoạt động khi người dùng tương tác, hãy cung cấp hàm actionStartActivity cho Button hoặc composable khác bằng cách sử dụng modifier GlanceModifier.clickable.

Cung cấp một trong những thông tin sau trong actionStartActivity:

Glance dịch Hành động thành PendingIntent bằng mục tiêu và tham số được cung cấp. Trong ví dụ sau, NavigationActivity được khởi chạy khi người dùng nhấp vào nút:

@Composable
fun MyContent() {
    // ..
    Button(
        text = "Go Home",
        onClick = actionStartActivity<MyActivity>()
    )
}

Ra mắt dịch vụ

Tương tự như việc chạy một hoạt động, hãy chạy một dịch vụ khi người dùng tương tác bằng một trong các phương thức actionStartService.

Cung cấp một trong những thông tin sau trong actionStartService:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Sync",
        onClick = actionStartService<SyncService>(
            isForegroundService = true // define how the service is launched
        )
    )
}

Gửi sự kiện truyền tin

Gửi sự kiện truyền tin về hoạt động tương tác của người dùng bằng một trong các phương thức actionSendBroadcast:

Cung cấp một trong những thông tin sau trong actionSendBroadcast:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Send",
        onClick = actionSendBroadcast<MyReceiver>()
    )
}

Thực hiện các thao tác tuỳ chỉnh

Thay vì chạy một mục tiêu cụ thể, Glance có thể sử dụng một hành động lambda hoặc actionRunCallback để thực hiện một hành động, chẳng hạn như cập nhật giao diện người dùng hoặc trạng thái khi người dùng tương tác.

Chạy hành động lambda

Bạn có thể sử dụng hàm lambda làm lệnh gọi lại cho các hoạt động tương tác trên giao diện người dùng.

Ví dụ: truyền hàm lambda vào đối tượng sửa đổi GlanceModifier.clickable:

Text(
    text = "Submit",
    modifier = GlanceModifier.clickable {
        submitData()
    }
)

Hoặc truyền tham số này đến tham số onClick trên các thành phần kết hợp hỗ trợ tham số này:

Button(
    text = "Submit",
    onClick = {
        submitData()
    }
)

Chạy ActionCallback

Ngoài ra, hãy sử dụng các phương thức actionRunCallback để thực hiện một hành động khi người dùng tương tác. Để thực hiện việc này, hãy cung cấp một phương thức triển khai tuỳ chỉnh của 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
    }
}

Khi người dùng nhấp vào, phương thức suspend onAction của ActionCallback được cung cấp sẽ được gọi, thực thi logic đã xác định (tức là yêu cầu làm mới dữ liệu).

Để cập nhật tiện ích sau khi thực hiện hành động, hãy tạo một thực thể mới và gọi update(..). Để biết thêm thông tin, hãy xem phần Quản lý trạng thái 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)
    }
}

Cung cấp tham số cho thao tác

Để cung cấp thêm thông tin cho một hành động, hãy sử dụng API ActionParameters để tạo một cặp khoá-giá trị được nhập. Ví dụ: để xác định đích đến được nhấp vào:

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() }
    }
}

Bên dưới, các tham số được đưa vào ý định dùng để khởi chạy hoạt động, cho phép Hoạt động mục tiêu truy xuất ý định đó.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val destination = intent.extras?.getString(KEY_DESTINATION) ?: return
        // ...
    }
}

Các tham số cũng được cung cấp cho ActionCallback. Sử dụng Parameters.Key đã xác định để truy xuất giá trị:

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