Screen View is a mobile analytics event that records the opening of each screen in an application. It is the equivalent of page_view for the web, adapted to the navigation model of mobile interfaces. According to Amplitude, 2024, Screen View is the most frequent event in app analytics, accounting for up to 40% of all events sent. Proper implementation of screen tracking is the foundation for analyzing user paths and funnels.
Key Takeaways
Screen View is an analytics event that is sent when a mobile application screen is opened. The event contains the screen name (screen_name), class (screen_class) and a timestamp. Unlike web analytics, where page_view is tied to a URL, in mobile applications screens are identified by the name of the Activity, Fragment, ViewController or Custom View.
| Parameter | Type | Example |
|---|---|---|
| screen_name | String | "Product Details" |
| screen_class | String | "ProductDetailActivity" |
| previous_screen | String | "CatalogScreen" |
| timestamp | Long | 1719876543000 |
| duration_sec | Int | 45 |
The previous_screen parameter is especially important: it allows restoring the sequence of transitions and building a Screen Flow — a map of user paths through the application.
Screen View and Page View solve the same task — recording a view — but in different environments. On the web, a URL uniquely identifies a page, and Page View is tied to document loading. In mobile applications, a screen is a UI state that does not necessarily correspond to a separate address.
Another difference is context depth. Screen View in a mobile application includes state parameters: whether the user is authorized, what data is loaded, whether the screen is opened in edit mode. Page View on the web rarely carries such context — it only records the fact of URL loading. This makes Screen View more informative for product analytics, since each event can be segmented by state.
The first mistake is sending screen_view on every state change within a screen (tab switching, opening a popup). Screen View should only record a full transition to a new screen, not micro-interactions.
The second mistake is using a technical class name instead of a readable name. "ProductDetailActivityKt" is useless for an analyst — use "Product Details" in screen_name.
The third mistake is sending screen_view without the corresponding fields. An empty screen_name creates a set of garbage records that cannot be grouped. Always pass at least screen_name and screen_class, even on test screens.
Implementation of Screen View tracking depends on the navigation architecture. Let us look at automatic and manual approaches using Jetpack Compose and SwiftUI as examples.
Use LifecycleEventObserver at the NavigationComponent level. Each time a user navigates to a new route, the screen_view event is triggered.
class ScreenTrackingObserver(
private val analytics: AnalyticsProvider
) : LifecycleEventObserver {
override fun onStateChanged(
source: LifecycleOwner,
event: Lifecycle.Event
) {
if (event == Lifecycle.Event.ON_RESUME) {
val route = source.getRouteFromLifecycleOwner()
analytics.logScreenView(
screenName = route.screenName,
screenClass = source.getLocalClassName()
)
}
}
}
// NavHost connection
fun NavBackStackEntry.trackScreenView(analytics: AnalyticsProvider) {
lifecycle.addObserver(ScreenTrackingObserver(analytics))
}
This approach guarantees that screen_view is sent every time the screen returns to the foreground, including returning from the background. Lifecycle.Event.ON_RESUME is the right moment for tracking, not ON_START or ON_CREATE.
In SwiftUI, the onAppear modifier built into each View is used. For automation, a ViewModifier is created.
struct ScreenTrackingModifier: ViewModifier {
let screenName: String
func body(content: Content) -> some View {
content.onAppear {
Analytics.shared().logScreenView(
name: screenName,
className: "\(Self.self)"
)
}
}
}
extension View {
func trackScreen(_ name: String) -> some View {
modifier(ScreenTrackingModifier(screenName: name))
}
}
// Usage:
ProductDetailView()
.trackScreen("Product Details")
The trackScreen modifier is added to any View with a single line. This is a clean and scalable solution for SwiftUI projects.
In projects with a modular architecture, each module can use its own screen naming, which leads to duplication of screen_name. A centralized ScreenName enum solves the problem — all screens are named according to a single standard in one place. Adding a new screen only requires a new constant in the enum, rather than searching through the entire codebase.
Use a sealed class to describe screen_name with grouping by feature: ProfileScreen.CHANGE_PASSWORD, OrdersScreen.ORDER_HISTORY, CatalogScreen.SEARCH_RESULTS. This simplifies filtering in analytics reports.
Screen Flow (or Path Analysis) is a visualization of the sequence of screens a user goes through. It is the primary tool for identifying bottlenecks in navigation.
Each Screen View with the previous_screen parameter provides a graph edge: CatalogScreen → ProductDetails → CartScreen. By aggregating all transitions, a path map is built. A three-step funnel based on Screen Flow shows where users drop off.
According to Mixpanel (2024), Screen Flow analysis reveals up to 40% of UX issues that are not visible when analyzing individual events. For example, a frequent transition ProductDetails → HomeScreen without a purchase indicates a problem with the price or product description.
Drop-off is a point where a user leaves a scenario. If 60% of users leave after the Loading screen, the problem is in loading speed or animation. If after a Paywall — in the cost or value of the subscription.
Firebase does not provide a ready-made Screen Flow report, but screen_view data is available in BigQuery. Build a query that groups transitions by pair (previous_screen, screen_name) and counts the frequency. The result is a transition matrix that can be visualized in Looker Studio as a Sankey diagram.
Supplement the Screen Flow with segmentation: separately for new users (first 7 days) and returning users. New users more often get stuck on onboarding screens, while experienced users reach target actions faster. Comparing the two flows reveals adaptation bottlenecks.
Choosing a tool for Screen View analytics depends on budget, stack, and required level of detail. Let us look at three popular solutions.
Firebase automatically tracks screens via the screen_view parameter in every event. No additional code is required after SDK integration. Limitation: screen_name is generated from Activity/ViewController, which does not always produce readable names.
Amplitude offers a built-in Pathfinder — a visual Screen Flow builder. Supports user properties and cohort segmentation. Allows renaming screens on the server side without changes to the application code.
Mixpanel provides a real-time Flows report. It can show not only linear transitions but also branches — which screens are visited after a specific one. Integrates with iOS, Android, Flutter and React Native SDKs.
Each screen_view event is a network data send. If an app sends screen_view on every tab switch (20+ per minute), it creates unnecessary load. Optimization: buffer screen_view and send in a batch every 5 seconds. Firebase automatically aggregates events, but custom SDKs may send each call immediately.
Measure the overhead of tracking: add a timestamp to each screen_view and calculate the delay from onResume to sending. If the delay exceeds 100 ms, tracking affects UX. Use a background thread for sending to avoid blocking the UI thread. On low-end devices, the difference is noticeable.
Frequently Asked Questions
Yes, each fragment with its own content is a separate screen. A TabLayout with three tabs should send three different screen_view events when switching. Exception: tab popups without independent navigation.
screen_class is a technical class name (e.g., “MainActivity”), used by developers. screen_name is a readable name (“Home Screen”), used in reports. SDKs often fill in screen_class automatically, while screen_name needs to be set manually.
When the device rotates, it recreates the Activity, which triggers a duplicate screen_view. Use a state check: send the event only when the screen changes, not on every ON_RESUME. Firebase and Amplitude automatically deduplicate screen_view.
For an average app — 10–30 screen_view events per user per day. News apps: 15–20. Games: 20–40. Utilities: 5–10. If the number exceeds 100, check whether screens are being sent on every tap rather than on a full transition.
Yes, screen_view is one of the indicators in A/B tests. Compare the number of screen views between variants A and B. If variant B’s “Checkout” screen receives 15% fewer screen_view events, it signals a problem in the product card.
Summary
We will develop a mobile application turnkey
IT Sectr creates iOS and Android applications for startups and businesses since 2017. We will advise you and propose the best solution.
Read also