Messwerte für Ihr Widget im Blick behalten

Android 16 enthält zusätzliche, detailliertere Messwert-APIs. Mit diesen Messwerten werden Tippaktionen wie das Klicken auf eine Schaltfläche, Scrollen, Impressionen sowie die Größe und Position des Widgets erfasst.

Die Haupt-API ist AppWidgetEvent. Verwenden Sie WorkManager, um einen periodischen Worker zu erstellen, der die Widget-Interaktionen erfasst, sei es täglich, wöchentlich oder immer dann, wenn Ihre App geöffnet wird.

Das folgende Snippet zeigt ein Beispiel für das Tracking von Klicks, Scrollvorgängen und der Dauer von Impressionen.

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

Um den Systemzustand zu erhalten, werden Ereignisse standardmäßig einmal pro Stunde gemeldet. Gerätehersteller können das Berichtsfenster jedoch ändern. Wenn ein Nutzer beispielsweise auf einem Pixel-Gerät innerhalb einer Stunde zehnmal durch dieselbe Liste in deinem Widget scrollt, wird für diese Stunde nur ein Scroll-Ereignis gezählt.

Zu Testzwecken können Sie das folgende Attribut auf eine bestimmte Zeit festlegen und Ihr Testgerät neu starten. Im folgenden Beispiel ist das Berichtsfenster auf 0 ms festgelegt und Ereignisse werden sofort gemeldet.

adb shell device_config override systemui widget_events_report_interval_ms 0

Wenn du ein benutzerdefiniertes Tag für die Berichterstellung zu Klicks und Scrollvorgängen festlegen möchtest, kannst du RemoteViews.setAppWidgetEventTag für eine Ansicht in deinem RemoteViews-Layout verwenden. Dieses Ganzzahl-Tag wird verwendet, wenn Sie AppWidgetEvents abfragen, die Klicks oder Scrollvorgänge in dieser Ansicht enthalten.