Cycle de vie, du démarrage à froid à la mise en veille
La surface OS d'une app Nucleus — verrou d'instance, deep links, login items, tâches de fond, énergie.
Une app desktop ne se résume pas à une fenêtre. Elle démarre depuis un binaire packagé, doit se comporter correctement quand on la lance deux fois, accepte des URL passées par l'OS, s'affiche dans le dock avec un badge, est relancée au login, exécute des cron jobs pendant qu'on dors, et lève le pied sur batterie. Le cluster lifecycle/ câble Nucleus à toute cette conversation.
TL;DR
SingleInstancegarantit "une seule app à la fois" et redirige les args CLI vers l'instance primaire.DeepLinkHandler+ le bloc Gradleprotocol { }gèrent les URLmonapp://...sur Apple Events (macOS), registre (Windows) et MIME types.desktop(Linux).NucleusAppexpose bundle id, version, vendeur et AUMID injectés par le plugin au build.ExecutableRuntimedit si l'app a été lancée depuis./gradlew run, un DMG, MSIX, Flatpak, AppImage, etc.- Les modules
launcher-*pilotent le menu du dock / la jump list / le quicklist Unity de chaque OS. autolaunchactive le démarrage au login ;schedulerenregistre des jobs cron qui survivent aux reboots ;service-management-macosfait la même chose pour des agents macOS compatibles sandbox.energy-managerthrottle le process quand la fenêtre est minimisée et garde l'écran allumé au besoin.taskbar-progresspeint la progression directement sur le dock / taskbar / Unity launcher.
Le cycle de vie, page par page
| Étape | Module | Page |
|---|---|---|
| Démarrage à froid, "y a quelqu'un ?" | nucleus-application + core-runtime | Single instance |
| URL et associations de fichiers | core-runtime + DSL plugin | Deep links |
| "Qui suis-je ?" au runtime | core-runtime (NucleusApp) | App metadata |
| "Comment ai-je été packagé ?" | core-runtime (ExecutableRuntime) | Executable type |
| Menu du dock (macOS) | launcher-macos | Launcher : macOS |
| Overlays taskbar, jump list (Windows) | launcher-windows | Launcher : Windows |
| Unity launcher, quicklist (Linux) | launcher-linux | Launcher : Linux |
| Démarrage au login | autolaunch | Auto-launch |
| Tâches périodiques / cron | scheduler | Scheduler |
Agents SMAppService (macOS) | service-management-macos | Service management |
| Efficacité énergétique + keep-awake | energy-manager | Energy manager |
| Progression dans le dock / la taskbar | taskbar-progress (+ -tao) | Taskbar progress |
Modèle mental
Chaque page part du principe que le app survit à n'importe quelle fenêtre. L'utilisateur la quitte depuis le dock, la relance via une notification, dépose un .csv sur son icône, la programme pour se réveiller à 3h du matin, puis se plaint qu'elle a vidé la batterie. Chacun de ces modules est un wrapper opinionné au-dessus de l'API native correspondante — SMAppService, ITaskbarList3, NSDockTile, com.canonical.Unity.LauncherEntry, timers systemd, SetProcessInformation et compagnie — pour qu'on livre un seul code Kotlin et que l'OS reconnaisse quand même son rejeton.
Deux modules sont les primitives porteuses sur lesquelles le reste s'appuie : core-runtime (la fondation — Platform, NucleusApp, SingleInstanceManager, DeepLinkHandler, ExecutableRuntime) et nucleus-application (le point d'entrée nucleusApplication { } qui les amorce automatiquement). Commence par ces deux pages.
Icônes FreeDesktop
Constantes Kotlin typées pour la FreeDesktop Icon Naming Specification — utilisées par notification-linux, launcher-linux et toute UI Linux qui résout les icônes par thème.
Une app, un seul process
Garantis une seule instance et redirige les relances (args CLI, deep links) vers elle.