معیارهای ویجت خود را پیگیری کنید

اندروید ۱۶ شامل 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")
}

برای حفظ سلامت سیستم، رویدادها به طور پیش‌فرض ساعتی یک بار گزارش می‌شوند، اگرچه تولیدکنندگان دستگاه ممکن است پنجره گزارش‌دهی را تغییر دهند. به عنوان مثال، در دستگاه‌های پیکسل اگر کاربری در یک ساعت 10 بار در یک لیست در ویجت شما پیمایش کند، فقط 1 رویداد پیمایش برای آن ساعت شمارش می‌شود.

برای آزمایش، می‌توانید ویژگی زیر را روی یک زمان مشخص تنظیم کنید و دستگاه آزمایشی خود را مجدداً راه‌اندازی کنید. در مثال زیر، پنجره گزارش روی 0 میلی‌ثانیه تنظیم شده است و رویدادها بلافاصله گزارش می‌شوند.

adb shell device_config override systemui widget_events_report_interval_ms 0

برای تنظیم یک تگ سفارشی برای گزارش کلیک‌ها و اسکرول‌ها، می‌توانید از RemoteViews.setAppWidgetEventTag در یک نما در طرح‌بندی RemoteViews خود استفاده کنید. این تگ عدد صحیح هنگام جستجوی AppWidgetEvents که شامل کلیک‌ها یا اسکرول‌ها در این نما می‌شود، استفاده می‌شود.