Develop

Application lifecycle handling

Updated: Oct 7, 2026
In order to successfully develop for Meta VR devices using the Horizon OS, developers should understand lifecycle events exposed by the Horizon OS. Immersive apps are required to handle lifecycle events to release on the Horizon Store, due to VRC.Quest.Functional.2 and VRC.Quest.Input.4. Correctly handling lifecycle events will allow your app to provide a better user experience.

Focus states

Application Pause

Application Pause events are sent when the Horizon OS expects the application to stop simulating, rendering, and accepting input. These events occur when the app is still loaded by the OS, but the user cannot see the app or interact with it. Applications should not allow any interactions by the paused user. See VRC.Quest.Functional.2 for more details.
To receive these events, use Unity’s built-in MonoBehaviour.OnApplicationPause(bool pauseStatus)⁠ function.

Input focus

The Horizon OS can support multiple running applications at once. For instance, a user playing an immersive game may keep a 2D Browser window containing a walkthrough visible while playing. In this scenario, although both the browser window and the immersive game are visible to the user, only one application is expected to respond to user input at a time. When the Horizon OS detects user intent to send input to a different app, it sends Input focus events to the app that is losing focus, and the app gaining focus (if applicable).
Apps are required to stop rendering any tracked controllers/hands, and ignore all input, upon losing input focus (see VRC.Quest.Input.4). However, it is up to the app developer to determine how losing input focus affects audio, rendering, and simulation. For instance, single-player action games may wish to pause entirely on losing input focus, while immersive video players may wish to continue video playback.
To receive these events, subscribe to the OVRManager.InputFocusAcquired and OVRManager.InputFocusLost events, or poll the OVRManager.hasInputFocus property. Alternatively, use Unity’s built-in MonoBehaviour.OnApplicationFocus(bool hasFocus)⁠ function.

HMD Mount/Unmount

Mount and unmount events are sent when the user physically puts on or removes the device. On Meta Quest headsets with a proximity sensor, once the headset is unmounted, an Application pause event is sent after the time configured under Settings > Power > Auto Sleep, unless the user puts the headset back on first.
Although it is not a VRC requirement to act on these events, applications may wish to display a Pause menu or mark a user as inactive on unmount.
To receive these events, subscribe to the OVRManager.HMDMounted and OVRManager.HMDUnmounted events.

Application lifecycle

Unity applications can listen or check for the following common events sent by the Horizon OS.

Application start

When the application is initialized:
  • HMD Mounted
  • Input Focus Acquired

HMD unmount and mount quickly

When a user removes the device, then quickly puts it back on
  • When the device is removed: HMD Unmounted
  • When the device is replaced: HMD Mounted

HMD unmount and mount with a delay

On a Meta Quest headset with a proximity sensor, when a user removes the headset, waits for the time configured under Settings > Power > Auto Sleep, then puts it back on:
  • When the device is removed: HMD Unmounted
  • Then, after the configured amount of time:
    • Input Focus Lost
    • Application Paused
  • When the device is replaced:
    • HMD Mounted
    • Application Unpaused
    • Input Focus Acquired

Power button is pressed to turn off the display

  • Application Paused
  • Input Focus Lost

Power button is pressed to turn on the display

  • Application Unpaused
  • Input Focus Acquired

Universal Menu is opened

  • When Universal Menu is opened:
    • Input Focus Lost
  • When User selects “resume”, or closes Universal Menu:
  • Input Focus Acquired