Démarrage au login
Activez, désactivez et interrogez le démarrage au login depuis Kotlin avec une API unique qui choisit le backend adapté au format de packaging courant.
Le module autolaunch vous permet d'activer, de désactiver et d'interroger le démarrage au login
depuis Kotlin, sans écrire de code spécifique à chaque OS. Il choisit le backend selon le format de
packaging courant au runtime — startup tasks MSIX, registre Win32, SMAppService macOS, service
utilisateur systemd Linux et portail Flatpak — et respecte les états que l'utilisateur a réglés en
dehors de votre app.
Ajouter la dépendance
dependencies {
implementation("dev.nucleusframework:nucleus.autolaunch:2.0.7")
}Sur macOS, le bridge JNI de nucleus.service-management-macos est tiré transitivement : vous n'avez
rien à déclarer en plus.
Vérifier et basculer le démarrage au login
Lisez l'état courant avec AutoLaunch.state() et branchez-vous dessus. Appelez enable() ou disable()
pour le changer, et openSystemSettings() quand l'utilisateur doit agir dans l'interface système :
import dev.nucleusframework.autolaunch.AutoLaunch
import dev.nucleusframework.autolaunch.AutoLaunchState
when (AutoLaunch.state()) {
AutoLaunchState.ENABLED -> {}
AutoLaunchState.DISABLED -> AutoLaunch.enable()
AutoLaunchState.DISABLED_BY_USER -> AutoLaunch.openSystemSettings()
AutoLaunchState.UNSUPPORTED -> { /* macOS < 13, environnement Linux non supporté */ }
else -> {}
}Ne bouclez jamais sur BLOCKED_BY_USER. Quand l'utilisateur a désactivé l'app via le Task Manager
ou les Réglages, enable() renvoie BLOCKED_BY_USER et continuera de refuser tant qu'il ne
réactive pas lui-même. Redirigez-le vers openSystemSettings().
Pour câbler un interrupteur en Compose, pilotez-le depuis state() :
Switch(
checked = AutoLaunch.state() == AutoLaunchState.ENABLED,
enabled = AutoLaunch.state() != AutoLaunchState.DISABLED_BY_USER,
onCheckedChange = { on ->
if (on) AutoLaunch.enable() else AutoLaunch.disable()
},
)Détecter un lancement au login
wasStartedAtLogin(args) indique si le process courant a été lancé par le mécanisme de login plutôt
que démarré à la main. Testez-le au point d'entrée de votre main() pour sauter un splash screen ou
démarrer en fenêtre réduite :
fun main(args: Array<String>) {
if (AutoLaunch.wasStartedAtLogin(args)) {
startMinimized = true
}
// ...
}Sur macOS, l'AppleEvent de login arrive après le démarrage de NSApplication.run(), donc le premier
appel depuis main() renvoie généralement false. La méthode met en cache les résultats positifs :
vous pouvez donc l'interroger depuis un LaunchedEffect une fois la boucle Compose lancée.
Fonctionnement
Le runtime choisit un backend à partir du système d'exploitation et du type d'exécutable détecté — aucun code conditionnel par OS de votre côté :
| Packaging | Backend |
|---|---|
| MSIX | WinRT Windows.ApplicationModel.StartupTask. Le plugin injecte l'extension du manifeste quand appx { addAutoLaunchExtension = true }. |
| Win32 (MSI / NSIS) | HKCU\Software\Microsoft\Windows\CurrentVersion\Run, avec lecture de StartupApproved\Run pour détecter une désactivation utilisateur. |
| macOS DMG / PKG (13+) | SMAppService.mainApp. Apparaît dans Réglages → Général → Ouverture au démarrage. |
| Linux (hôte : deb / rpm / AppImage) | service utilisateur systemd sous ~/.config/systemd/user/. |
| Linux (Flatpak) | XDG Desktop Portal org.freedesktop.portal.Background. |
Trois invariants imposés par le module, que vous ne devez pas contourner :
- Les choix de l'utilisateur sont définitifs. Dès qu'il désactive le démarrage au login via
l'interface système, l'état passe à
DISABLED_BY_USERetenable()renvoieBLOCKED_BY_USERjusqu'à ce qu'il réactive lui-même. - Les mises à jour silencieuses ne réinitialisent pas l'état. Le backend Win32 n'écrit dans
Runqu'à unenable()et ne touche àStartupApprovedqu'à undisable(). - MSIX exige l'extension du manifeste. Sans
<uap5:StartupTask>dansPackage.appxmanifest, l'API renvoieUNSUPPORTED. MettezaddAutoLaunchExtension = truedans le bloc plugin et il s'en occupe.
Référence de l'API
AutoLaunch
AutoLaunch est un object ; toutes les méthodes sont statiques.
| Méthode | Renvoie | Notes |
|---|---|---|
state() | AutoLaunchState | État courant du démarrage au login. |
enable() | AutoLaunchResult | Demande l'activation. |
disable() | AutoLaunchResult | Demande la désactivation. |
openSystemSettings() | Boolean | Ouvre ms-settings:startupapps (Windows) ou Réglages → Général → Ouverture au démarrage (macOS). true si l'interface s'est lancée. |
wasStartedAtLogin(args) | Boolean | Indique si le process a été lancé par le login. Renvoie false en dev. |
isEnabled() | Boolean | true pour ENABLED ou ENABLED_BY_POLICY. |
isUserLocked() | Boolean | true quand l'état est DISABLED_BY_USER. |
diagnostic() | String | Trace lisible du backend, pour les tickets support. |
preload() | Unit | Résout le backend et charge sa bibliothèque JNI en avance. Appelez-la depuis un thread en arrière-plan pour éviter un blocage au premier appel sur macOS. |
AutoLaunchState
ENABLED, DISABLED, DISABLED_BY_USER, DISABLED_BY_POLICY, ENABLED_BY_POLICY, UNSUPPORTED.
DISABLED_BY_POLICY et ENABLED_BY_POLICY sont des états en lecture seule imposés par la Group
Policy (MSIX uniquement).
AutoLaunchResult
OK, UNCHANGED, BLOCKED_BY_USER, BLOCKED_BY_POLICY, UNSUPPORTED, ERROR.
AutoLaunchConfig
Surcharge les valeurs par défaut avant le premier appel à AutoLaunch :
| Propriété | Effet |
|---|---|
taskId | Id du startup task MSIX ; doit correspondre à <uap5:StartupTask TaskId="...">. |
executablePath | Chemin sous HKCU\...\Run (Win32). Résolu depuis le process en cours si null. |
autostartArgument | Marqueur CLI ajouté à la commande enregistrée (défaut --nucleus-autostart). |
registryValueName | Nom de valeur sous HKCU\...\Run (Win32). |
backgroundReason | Raison affichée dans le prompt du portail Flatpak. |
Notes
- Sur MSIX, changer le démarrage au login via l'API ne rafraîchit pas en direct l'onglet « Apps au démarrage » du Task Manager : Windows met cette vue à jour au prochain login. L'état stocké est correct ; seul l'affichage est en retard.
- La détection du login sur macOS lit le marqueur
keyAELaunchedAsLogInItemdans l'AppleEvent queloginwindowenvoie au login. Apple ne fournit aucune API publique pour ça. wasStartedAtLogin()renvoiefalseen dev (ExecutableRuntime.isDev()) pour éviter les faux positifs liés aux variables d'environnement héritées du shell parent. Les builds de production doivent définir la propriété systèmenucleus.executable.typeou fournir le fichier marqueur.nucleus-executable-type, sinonExecutableRuntimeretombe surDEVet la méthode renvoie toujoursfalse.
Et ensuite
- Type d'exécutable — comment le runtime détecte le format de packaging qui pilote le choix du backend.
- Gestion des services — enregistrer login items, agents et daemons sur macOS.
- Instance unique — router un lancement au login vers un process déjà en cours.
- Scheduler — exécuter du travail en arrière-plan après un lancement au login.
Launcher (Linux)
Affichez des badges de compte, des barres de progression, un drapeau d'urgence et des menus quicklist sur le launcher Linux depuis Kotlin.
Scheduler — des cron jobs qui survivent aux reboots
Exécutez des tâches périodiques, calendaires et on-boot depuis Kotlin, que l'OS déclenche à l'heure même quand votre app est fermée.