Android 16 có thêm các API chỉ số chi tiết hơn. Các chỉ số này theo dõi các thao tác nhấn như nhấp vào nút, cuộn, số lượt hiển thị cũng như kích thước và vị trí của tiện ích.
API chính là AppWidgetEvent. Sử dụng WorkManager để tạo một worker định kỳ ghi lại mức độ tương tác với tiện ích, cho dù là hằng ngày, hằng tuần hay bất cứ khi nào ứng dụng của bạn được mở.
Hãy xem đoạn mã sau đây để biết ví dụ về cách theo dõi lượt nhấp, lượt cuộn và thời lượng hiển thị.
@RequiresApi(Build.VERSION_CODES_FULL.BAKLAVA_1) fun getWidgetEngagementMetrics(context: Context) { val manager = AppWidgetManager.getInstance(context) val endTime = System.currentTimeMillis() val startTime = endTime - (24 * 60 * 60 * 1000) // a day ago val events = manager.queryAppWidgetEvents(startTime, endTime) if (events.isEmpty()) { Log.d(TAG, "No events found for the given time range.") } val metrics = hashMapOf( "clicks" to 0L, "scrolls" to 0L, "totalImpressionLength" to 0L ) for (event in events) { Log.d(TAG, "Event Start: ${event.start}") Log.d(TAG, "Event End: ${event.end}") val widgetId = event.appWidgetId // Tap actions val clickedIds = event.clickedIds if (clickedIds?.isNotEmpty() == true) { metrics["clicks"] = metrics.getValue("clicks") + clickedIds.size // Log or analyze which components were clicked. for (id in clickedIds) { Log.d(TAG, "Widget $widgetId: Tap event on component with ID $id") } } // Scroll events val scrolledIds = event.scrolledIds if (scrolledIds?.isNotEmpty() == true) { metrics["scrolls"] = metrics.getValue("scrolls") + scrolledIds.size // Log or analyze which lists were scrolled. for (id in scrolledIds) { Log.d(TAG, "Widget $widgetId: Scroll event in list with ID/tag $id") } } // Impressions metrics["totalImpressionLength"] = metrics.getValue("totalImpressionLength") + event.visibleDuration.toMillis() Log.d( TAG, "Widget $widgetId: Impression event with duration " + event.visibleDuration.toMillis() + "ms" ) // Position val position = event.position if (position != null) { Log.d( TAG, "Widget $widgetId: left=${position.left}, right=${position.right}, top=${position.top}, bottom=${position.bottom}" ) } } Log.d("WidgetMetrics", "Metrics: $metrics") }
Để duy trì tình trạng hệ thống, các sự kiện được báo cáo mỗi giờ một lần theo mặc định, mặc dù nhà sản xuất thiết bị có thể thay đổi khoảng thời gian báo cáo. Ví dụ: trên thiết bị Pixel, nếu người dùng cuộn cùng một danh sách trong tiện ích 10 lần trong một giờ, thì chỉ có 1 sự kiện cuộn được tính cho giờ đó.
Để kiểm thử, bạn có thể đặt thuộc tính sau thành một thời gian cụ thể và khởi động lại thiết bị kiểm thử. Trong ví dụ sau, khoảng thời gian báo cáo được đặt thành 0 mili giây và các sự kiện được báo cáo ngay lập tức.
adb shell device_config override systemui widget_events_report_interval_ms 0
Để đặt thẻ tuỳ chỉnh cho lượt nhấp và lượt cuộn báo cáo, bạn có thể sử dụng RemoteViews.setAppWidgetEventTag trên một thành phần hiển thị trong bố cục RemoteViews. Thẻ số nguyên này được dùng khi bạn truy vấn AppWidgetEvents có chứa các lượt nhấp hoặc lượt cuộn trên thành phần hiển thị này.