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

Tính năng Glance đơn giản hoá việc xử lý hoạt động tương tác của người dùng thông qua các lớp Action. Tính năng Glance Các lớp Action xác định những hành động mà người dùng có thể thực hiện, đồng thời bạn có thể chỉ định được thực hiện để đáp ứng hành động đó. Bạn có thể áp dụng Action cho bất kỳ 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 khi 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 thông qua PendingIntents.

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

Chạy một hoạt động

Để khởi chạy một hoạt động dựa trên tương tác của người dùng, hãy cung cấp hàm actionStartActivity sang Button hoặc thành phần kết hợp khác thông qua Đối tượng sửa đổi GlanceModifier.clickable(..).

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

  • Lớp hoạt động mục tiêu
  • ComponentName
  • Một ý định

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

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

Chạy một dịch vụ

Tương tự như khởi chạy một hoạt động, hãy khởi chạy dịch vụ dựa trên tương tác của người dùng bằng một của phương thức actionStartService.

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

  • Lớp hoạt động mục tiêu
  • ComponentName
  • Một ý định

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

Gửi một sự kiện truyền phát

Gửi sự kiện truyền tin khi người dùng tương tác bằng một trong Phương thức actionSendBroadcast:

Cung cấp một trong các 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ể, tính năng Glance có thể sử dụng thao tác 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 trên tương tác của người dùng.

Chạy các thao tác lambda

Bạn có thể sử dụng các 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 GlanceModifier.clickable đối tượng sửa đổi:

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

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

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

Chạy ActionCallback

Ngoài ra, hãy dùng các phương thức actionRunCallback để thực hiện một thao tác trên tương tác của người dùng. Để thực hiện điều này, hãy cung cấp triển khai tuỳ chỉnh của thuộc tính 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, phương thức suspend onAction của giá trị được cung cấp ActionCallback được gọi, thực thi logic đã xác định (ví dụ: yêu cầu làm mới dữ liệu).

Để cập nhật tiện ích này sau khi thực hiện thao tác này, 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 hành động

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

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ó trong ý định dùng để khởi chạy hoạt động, cho phép Hoạt động mục tiêu truy xuất hoạt động đó.

    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 giá trị xác định Parameters.Key để 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
        // ...
    }
}