Android 16 มี API เมตริกเพิ่มเติมที่ละเอียดกว่า เมตริกเหล่านี้จะติดตามการแตะ เช่น การคลิกปุ่ม การเลื่อน การแสดงผล รวมถึงขนาดและตำแหน่งของวิดเจ็ต
API หลักคือ AppWidgetEvent
ใช้ WorkManager
เพื่อสร้าง Worker ที่ทำงานเป็นระยะๆ
ซึ่งจะบันทึกการมีส่วนร่วมของวิดเจ็ตทุกชั่วโมง
ดูตัวอย่างข้อมูลโค้ดต่อไปนี้เพื่อดูตัวอย่างการติดตามการคลิก การเลื่อน และ ระยะเวลาการแสดงผล
@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") }
ระบบจะรายงานเหตุการณ์ทุกชั่วโมงโดยค่าเริ่มต้นเพื่อรักษาสถานะของระบบ แต่ผู้ผลิตอุปกรณ์อาจเปลี่ยนกรอบเวลาการรายงานได้ ตัวอย่างเช่น ในอุปกรณ์ Pixel หากผู้ใช้เลื่อนรายการเดียวกันในวิดเจ็ต 10 ครั้งใน 1 ชั่วโมง ระบบจะนับเหตุการณ์การเลื่อนเพียง 1 รายการสำหรับชั่วโมงนั้น
สำหรับการทดสอบ คุณสามารถตั้งค่าแอตทริบิวต์ต่อไปนี้เป็นเวลาที่ระบุและรีสตาร์ท อุปกรณ์ทดสอบ ในตัวอย่างต่อไปนี้ หน้าต่างรายงานตั้งค่าเป็น 0 มิลลิวินาที และระบบจะรายงานเหตุการณ์ทันที
adb shell device_config override systemui widget_events_report_interval_ms 0
หากต้องการตั้งค่าแท็กที่กำหนดเองสำหรับการรายงานการคลิกและการเลื่อน คุณสามารถใช้ RemoteViews.setAppWidgetEventTag ในมุมมองภายในRemoteViews
เลย์เอาต์
แท็กจำนวนเต็มนี้ใช้เมื่อคุณค้นหา AppWidgetEvents
ที่มีการคลิกหรือการเลื่อนในมุมมองนี้