Empêcher le lancement multiple d'applications Android

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.

Étiquettes: Android Activity Task Stack AndroidManifest intent

Publié le 16 juin à 03h26