Trade-offs between Complication.value versus ActivityMonitor/SensorHistory classes

Now that we can access several data points straight from a device's native complication by using the getComplication().value method, I was curious if there were any trade offs between using the Complications class versus other Classes like the ActivityMonitor or SensorHistory to get similar data points. The main things I'd be curious about would be memory usage and battery life (assuming everything was coded appropriately).

For example, on my FR965, I can fetch my current heart rate from Activity.getActivityInfo().currentHeartRate, but now, if I'm not mistaken, I can also subscribe to the complication of type COMPLICATION_TYPE_HEART_RATE and access its value from there.

Likewise, for number of steps since midnight of current day, I could use ActivityMonitor.getInfo().steps versus complication of type COMPLICATION_TYPE_STEPS.

I did a test on my FR965 for stress, and I used the SensorHistory.getStressHistory() method versus the COMPLICATION_TYPE_STRESS complication, and the complication value was updating much more frequently than the SensorHistory method. The complication value was updating as it would on a native watch face, which I guess is the whole point... but could I be doing something wrong with the SensorHistory data, or is that lag to be expected? Stress is one of those values I'd want to have as close to real-time as possible.. or at least be able to grab the current value when I flick my wrist and look at the watch.

So would I run into any major issues with my watch's battery life or performance if I just subscribed to like 5-6 complications and displayed that data on my WF, instead of grabbing them from other classes? I'm a sucker for consistency and reusing code, and this just feels like it's set-up pretty well for it... but I'd rather not sacrifice my battery life too much in the process. Would that question be dependent on the specific complications I'd want to use?

On a semi-related note, does anyone know if we'll be able to access the "training readiness score" as a complication any time soon? I really like having that value displayed on my native watch face, and I don't see it available anywhere on the API. Would be cool to use it as an arc or bar somewhere on a custom watch face.

  • The complication and what you see in Activity.Info.currentHeartrate come from different sources in the sim.  With that sample you can pick a target, like the fr245 that doesn't support complications, and you'll see you have to start the simulation for that.

  • From my limited testing getting HR from a complication and ActivityInfo display the same values on my watch and update at basically the same rate. This is on a Venu2 when the view is in high power mode and updating once a second. In the simulator profiler getting it from the complication uses more resources than getting it from ActivityInfo. So, I'll just be using ActivityInfo as it's also less code and easier to use. I'm not sure I really see the benefit to using a complication here, since my watch doesn't support onPartialUpdate and I only really care about it when the view is active.

  • The advantage on using a complication is on touch devices that support them, you can add onPress() logic so when you press on something like Heart Rate, it launches the widget for that and you see much more detail.  Try it with the sample you are using on a real device.  In a sim, you just get a screen that says

  • Technically you could use a hybrid approach as Myaro mentioned. If Complications are heavier on memory and battery (which was my original concern), you could get the value of the metric from the more classic Modules (ActivityMonitor, SensorHistory, Weather, etc) and then just generate the Complication Id on the fly in your Delegate and launch the widget. So you’re only using the Complications Module to launch the widget, but not really for the value or anything else.

    for me, that’s fine for maybe like 90% of the complications that are available… but Stress still gets refreshed way more frequently in the complication than it does in SensorHistory. Also, I don’t believe you can get the “Next Calendar Event Time” any other way except through that complication. There might be apps out there that sync with Google or Apple cal, but that’s outside of my programming experience, and a packaged Complication for calendar event is so much cleaner to use lol. 

    Does anyone have data that shows Complications are heavier on battery? I really like using them for their simplicity. 

  • The watch face I use day-to-day can access 5 complications, with one of them optionally from a CIQ publisher, and I have zero complaints about the battery life.  And when the data is published, it doesn't really matter much f you are subscribing or not.

    Also, remember with SensorHistory, that's a history that at most updates every 1-2 minutes. So for things like heart rate is no where close to real time

  • Appreciate the insight on the battery performance, Jim. I love using the Complications module tbh, so I'm hoping there's minimal performance/battery discrepancies between the "classic" modules and the newer complications module. 

    I basically started my little project just to "tweak" a native watch face that I liked on my FR965... only problem I had with the native face was that it had a big bubble displaying the seconds of the clock, and I wanted to swap it out to something meaningful. So in the screenshot below where I show my step count in the bottom center, the native watch face just had a big bubble showing the seconds of the clock. Felt like a waste of real estate. The native watch face also doesn't have the notification icon and the battery status unless you want to take up one of the 6 main metric spots, which also felt like a waste of real estate.

    After a few iterations of my project, the top 3 and bottom 3 metrics can be swapped out for new complications via an on-device Menu2, and basically everything on the screen can launch the native widgets, including the notification icon and the battery status. I'm pretty happy with it now... it looks extremely close to a native fr965 watch face, and it functions like one too with the customizations and widget launches. 




  • Looks very nice! What are the names of the fonts you used for the numbers?

  • the font for the metrics are just different sized Roboto fonts. You can use the Graphics.getVectorFont method if your device supports it. 

    The time fonts are a slightly modified version of a Google Font called Albert Sans. I used FontForge to create an outline version of it for the “Hours” portion, and I slightly tweaked the “5” glyph because it felt a bit blocky.

    https://fonts.google.com/specimen/Albert+Sans