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

Waze giúp đơ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. Các lớp Action của nhanh sẽ xác định các 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 nằm trên một quy trình từ xa, vì vậy, các hành động sẽ được xác định tại thời điểm tạo và quá trình thực thi sẽ 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 được mô tả trên trang này:

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

Để khởi chạy một hoạt động khi tương tác của người dùng, hãy cung cấp hàm actionStartActivity cho một 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 mục sau trong actionStartActivity:

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

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

Chạy một dịch vụ

Tương tự như việc khởi chạy một hoạt động, hãy khởi chạy 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 các mục 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 sự kiện phát sóng

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

Cung cấp một trong các mục 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ì khởi chạy một mục tiêu cụ thể, tính năng Xem nhanh 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 khi 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 đến đối tượng sửa đổi GlanceModifier.clickable:

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

Hoặc truyền nó vào 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 sử dụng các phương thức actionRunCallback để thực hiện hành động đối với tương tác của người dùng. Để thực hiện việc này, hãy cung cấp 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 đã 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 chi tiết, hãy xem phần Quản lý trạng thái tổng quan nhanh

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 các hành động

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

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