-
Notifications
You must be signed in to change notification settings - Fork 0
Conception du Foreground
Le service doit être autonome et gérer quatre piliers majeurs :
-
Gestion de l'Audio (TTS) : Initialiser le moteur
TextToSpeechet gérer la file d'attente des phrases à dicter. -
Interception des entrées : Capturer les touches du clavier Bluetooth (via un
BroadcastReceiverou la transmission d'événements depuis l'Activity). -
Logique de validation : Comparer en temps réel ce qui est tapé avec la phrase dictée et déclencher les sons de feedback (bip d'erreur/succès).
-
Persistance : Enregistrer la session dans la base de données Room une fois l'exercice terminé ou interrompu.
Le Foreground Service suit un cycle de vie strict pour éviter d'être tué par le système Android.
Les étapes clés :
-
onCreate(): Initialisation unique du moteur TTS, duSoundPool(pour les bruitages rapides) et de la base de données Room. -
onStartCommand(): C'est ici que le service passe en "Foreground". Il reçoit l'Intentcontenant le texte à dicter et affiche la Notification Permanente. -
Running State: Le service boucle sur les phrases. Il attend une validation (touche Entrée ou phrase complète) pour passer à la suite. -
onDestroy(): Libération cruciale des ressources (TTS, Media Player) pour éviter les fuites de mémoire.
Voici comment structurer la classe principale pour assurer la stabilité en mode "nomade" :
class TypingService : Service() {
private lateinit var tts: TextToSpeech
private lateinit var soundPool: SoundPool
private var currentText: String = ""
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val text = intent?.getStringExtra("EXTRA_TEXT") ?: ""
// 1. Passer en Foreground immédiatement
val notification = createNotification("Exercice en cours...")
startForeground(NOTIFICATION_ID, notification)
// 2. Lancer la dictée
speakPhrase(text)
return START_NOT_STICKY // Ne redémarre pas tout seul s'il est tué
}
private fun createNotification(content: String): Notification {
// Construction de la notification obligatoire avec un PendingIntent
// pour revenir à l'app si besoin.``
}
override fun onDestroy() {
tts.stop()
tts.shutdown()
super.onDestroy()
}
}-
Wakelocks : Bien que le
Foreground Serviceaide, l'utilisation d'unPartial WakeLockpeut être nécessaire si vous traitez des données complexes pour éviter que le CPU ne s'endorme. -
Gestion du Focus Audio : Le service doit demander le
AudioFocus. Si l'utilisateur reçoit un appel, le service doit mettre la dictée en pause automatiquement. -
Interception Bluetooth : Puisque l'écran est éteint, l'Activity ne reçoit plus les événements clavier. Vous devrez peut-être utiliser un
MediaButtonReceiverdétourné ou maintenir une fenêtre invisible si les restrictions Android deviennent trop fortes sur les événements HID en arrière-plan.