Acknowledged
CIQQA-4693

App terminated on wrist-off during an ActivityRecording session leaves the session orphaned - activity list blocked, watch needs a reboot

Device: Forerunner 265, software version 29.05 SDK: 9.2.0 (connectiq-sdk-win-9.2.0-2026-06-09) Type: watch-app, recording via ActivityRecording.createSession Reproducible: every time

What happens

Taking the watch off the wrist while a Connect IQ app is recording an activity terminates the app without the session being ended. The watch is then left with a recording session that has no owning app. From that point:

  • the Connect IQ error screen is shown
  • the activity list cannot be opened
  • MTP / USB file transfer hangs
  • a reboot is required to clear it

After the reboot the watch offers the orphaned session on its native stop menu (Resume / Save / Discard). Saving from there produces a valid activity, but with no developer fields — the app that owned those FitContributor.Field objects is gone, so nothing writes them.

Steps to reproduce

  1. Start a watch-app that calls ActivityRecording.createSession(...) and start().
  2. Let it record for ~30 seconds.
  3. Take the watch off the wrist.

Bisect

The app being closed on wrist-off is normal and harmless. It is only a problem when a session is recording:

App state when the watch is removed Result
On a menu, no session created App closes to the watch face. Clean. Reopens fine.
On an app view, no session created App closes to the watch face. Clean. Reopens fine.
Session created and recording App terminated, session orphaned, activity list blocked, reboot required

A native activity (built-in Cardio) on the same watch is unaffected — it keeps running with the watch off and does not pause.

Not app-specific

I have reproduced the same failure, including the required reboot, with two other unrelated Connect IQ apps in the same category that record activities. This does not appear to be specific to any one app.

Workaround

Implementing AppBase.onStop() and ending the session there resolves it:

monkey
class MyApp extends Application.AppBase {

    function onStop(state as Lang.Dictionary?) as Void {
        if (gRaceView != null) {
            (gRaceView as RaceView).saveOnExit();   // stop() then save()
        }
    }
}

With this in place, removing the watch mid-activity closes the app cleanly, the activity is saved, developer fields are written correctly, and no reboot is needed. onStop does appear to be called reliably in this path, and there is enough time in it to complete a save() — I have confirmed the resulting FIT contains all ten of my developer fields and all laps.

Questions

  1. Is terminating a watch-app that owns an active recording session the intended behaviour on wrist-off?
  2. If so, is onStop() the sanctioned place to end the session, and is it guaranteed to run before termination in this path?
  3. Should the system be able to recover an orphaned session without blocking the activity list and requiring a reboot? That part seems like it should be handled regardless of what the app does.

Happy to supply a FIT file or a minimal reproduction project.