Problématique du lancement unique
Sur Android, les applications comme les messageries instnatanées ou les réseaux sociaux évitent généralement d'ouvrir plusieurs instances simultanées. Lorsqu'une application passe en arrière-plan via le bouton Accueil, son état doit être préservé. En l'absence de configuration spécifique, le système peut créer une nouvelle instance au lieu de restaurer la session existante.
Configuraton du Manifest Android
Pour conserver l'état de la tâche racine, ajoutez l'attribut android:alwaysRetainTaskState="true" à l'activité de démarrage dans le fichier AndroidManifest.xml. Cette activité, souvent nommée SplashActivity ou MainActivity, sert de point d'entrée principal.
<activity
android:name=".SplashActivity"
android:alwaysRetainTaskState="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
L'attribut force le système à maintenir la pile de tâches intacte même après une longue période d'inactivité. Lors de la réouverture, l'application affiche la dernière activité au sommet de la pile.
Gestion de la touche Retour
Pour minimiser l'application au lieu de la terminer, surchargez la méthode onBackPressed(). Une approche consiste à rediriger vers l'écran d'accueil via une intention explicite :
@Override
public void onBackPressed() {
// Retour à l'écran d'accueil du système
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(homeIntent);
}
Cependant, cette méthode peut provoquer un sélecteur d'application si plusieurs lanceurs sont installés. Pour une transition plus fluide, utilisez moveTaskToBack() :
@Override
public void onBackPressed() {
// Déplacement de la tâche courante en arrière-plan
boolean nonCritical = true;
moveTaskToBack(nonCritical);
}
Cette méthode déplace l'ensemble de la pile de tâches en arrière-plan, similaire à une réduction de fenêtre sur un PC. Elle améliore les performances lors de la réouverture et évite les conflits avec d'autres lanceurs.
Différences de comportement
L'utilisation d'intention avec CATEGORY_HOME affiche par défaut l'écran d'accueil principal, tandis que moveTaskToBack() conserve la position précédente du bureau. Les deux approches empêchent le lancement d'nistances multiples et sont courantes dans les applications de messagerie pour maintenir une session active en arrière-plan.