Widget'ınızın metriklerini izleme

Android 16, daha ayrıntılı ek metrik API'leri içerir. Bu metrikler; düğme tıklama, kaydırma, gösterim gibi dokunma işlemlerinin yanı sıra widget'ın boyutunu ve konumunu izler.

Ana API AppWidgetEvent'dir. WorkManager kullanarak saatte bir kez widget etkileşimini yakalayan düzenli bir çalışan oluşturun.

Tıklamaları, kaydırmaları ve gösterim süresini izleme örneği için aşağıdaki snippet'e bakın.

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

Sistem sağlığını korumak için etkinlikler varsayılan olarak saatte bir kez bildirilir. Ancak cihaz üreticileri raporlama aralığını değiştirebilir. Örneğin, Pixel cihazlarda bir kullanıcı, widget'ınızdaki aynı listeyi bir saat içinde 10 kez kaydırırsa o saat için yalnızca 1 kaydırma etkinliği sayılır.

Test için aşağıdaki özelliği belirli bir zamana ayarlayabilir ve test cihazınızı yeniden başlatabilirsiniz. Aşağıdaki örnekte, rapor penceresi 0 ms olarak ayarlanmıştır ve etkinlikler anında raporlanır.

adb shell device_config override systemui widget_events_report_interval_ms 0

Tıklamaları ve kaydırmaları raporlamak için özel bir etiket ayarlamak üzere RemoteViews düzeninizdeki bir görünümde RemoteViews.setAppWidgetEventTag'i kullanabilirsiniz. Bu tam sayı etiketi, bu görünümde tıklamalar veya kaydırmalar içeren AppWidgetEvents için sorgu yaptığınızda kullanılır.