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, chẳng hạn như lượt nhấp vào nút, thao tác di chuyể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 mỗi giờ một lần.
Hãy xem đoạn mã sau đây để biết ví dụ về cách theo dõi số 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ì trạng thái hệ thống, các sự kiện được báo cáo mỗi giờ theo mặc định, mặc dù các 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 các thiết bị Pixel, nếu người dùng cuộn cùng một danh sách trong tiện ích của bạn 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, cửa sổ 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 báo cáo lượt nhấp và lượt cuộn, bạn có thể sử dụng RemoteViews.setAppWidgetEventTag trên một khung hiển thị trong bố cục RemoteViews
của bạn. Thẻ số nguyên này được dùng khi bạn truy vấn AppWidgetEvents
bao gồm lượt nhấp hoặc lượt di chuyển trên khung hiển thị này.