public interface HealthBackgroundListenerFactory
Creates HealthBackgroundListener instances after the app’s process has
been killed and relaunched.
Why this exists rather than reflection
When the operating system relaunches an app in the background to deliver
health data, the only durable record of which listener to invoke is
whatever was persisted – a name, not a Class. Resolving that name
reflectively is the obvious approach and the wrong one on this
framework’s targets:
- A class referenced only by a string is invisible to the iOS and JavaScript translators’ dead-code elimination, so it can be stripped out of the very build that needs it.
- Obfuscation renames the class, so a name persisted by an earlier version of the app no longer resolves.
So the binding is produced at build time instead. The build server
scans for implementations of HealthBackgroundListener, generates a
factory that constructs each one with a direct new expression – a
real reference, which dead-code elimination and obfuscation both follow
correctly – and registers it through
HealthStore.setBackgroundListenerFactory(HealthBackgroundListenerFactory)
during app startup.
Application code never implements or calls this.
Methods
public abstract HealthBackgroundListener create(String className) | Creates the listener registered under className, or returns null when this build has no such listener. |
Method details
create
public abstract HealthBackgroundListener create(String className)Creates the listener registered under className, or returns null
when this build has no such listener.
className is the source-level class name recorded when the
subscription was registered. It stays valid across obfuscation
because the build server emits a keep rule for every class it
generates a binding for.