Melacak metrik untuk widget

Android 16 menyertakan API metrik tambahan yang lebih terperinci. Metrik ini melacak tindakan ketuk seperti klik tombol, scroll, tayangan, serta ukuran dan posisi widget.

API utama adalah AppWidgetEvent. Gunakan WorkManager untuk membuat pekerja berkala yang merekam interaksi widget setiap jam.

Lihat cuplikan berikut untuk mengetahui contoh pelacakan klik, scroll, dan durasi tayangan.

@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")
}

Untuk menjaga kesehatan sistem, peristiwa dilaporkan sekali per jam secara default, meskipun produsen perangkat dapat mengubah periode pelaporan. Misalnya, di perangkat Pixel, jika pengguna men-scroll daftar yang sama di widget Anda 10 kali dalam satu jam, hanya 1 peristiwa scroll yang akan dihitung untuk jam tersebut.

Untuk pengujian, Anda dapat menyetel atribut berikut ke waktu tertentu dan memulai ulang perangkat pengujian. Dalam contoh berikut, jendela laporan ditetapkan ke 0 md dan peristiwa dilaporkan dengan segera.

adb shell device_config override systemui widget_events_report_interval_ms 0

Untuk menetapkan tag kustom untuk melaporkan klik dan scroll, Anda dapat menggunakan RemoteViews.setAppWidgetEventTag pada tampilan dalam tata letak RemoteViews Anda. Tag bilangan bulat ini digunakan saat Anda membuat kueri untuk AppWidgetEvents yang mencakup klik atau scroll pada tampilan ini.