Sobes.tech
Middle

Comment gérer la situation lorsqu'une activité s'ouvre plusieurs fois en raison d'un deeplink ?

sobes.tech IA

Réponse de l'IA

Il existe plusieurs approches :

  1. Utilisation des drapeaux dans Intent :

    • FLAG_ACTIVITY_SINGLE_TOP : Si l'activité est déjà en haut de la pile, la méthode onNewIntent() sera appelée au lieu de créer une nouvelle instance.
    • FLAG_ACTIVITY_CLEAR_TOP : Si l'activité existe déjà dans la pile, toutes celles au-dessus seront terminées et l'activité sera portée en haut.
    • En combinaison avec FLAG_ACTIVITY_NEW_TASK : Souvent utilisé avec CLEAR_TOP pour gérer les activités d'une autre tâche.
  2. Configuration du launchMode dans AndroidManifest.xml :

    • singleTop : Semblable à FLAG_ACTIVITY_SINGLE_TOP lors du lancement via Intent.
    • singleTask : L'activité est la racine d'une nouvelle tâche ; si une instance existe déjà, elle sera ramenée en avant, et toutes celles au-dessus seront terminées.
    • singleInstance : L'activité existe dans sa propre tâche et est la seule dans cette tâche.
  3. Vérification de l'existence de l'activité avant de la lancer :

    • Utilisez ActivityManager pour vérifier la pile d'activités en cours. Cette approche est moins préférée en raison de sa complexité et de ses coûts.
  4. Réaction à onNewIntent() :

    • Lorsqu'on utilise singleTop ou FLAG_ACTIVITY_SINGLE_TOP, toute la logique de traitement du deeplink doit être implémentée dans onNewIntent(), et non dans onCreate(). N'oubliez pas d'appeler setIntent(intent) dans onNewIntent() pour mettre à jour l'Intent accessible via getIntent().

Exemple d'utilisation de launchMode="singleTop" et onNewIntent() :

Dans AndroidManifest.xml :

<activity
    android:name=".YourDeeplinkActivity"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="your_scheme"
              android:host="your_host"
              android:pathPrefix="/your_path" />
    </intent-filter>
</activity>

Dans la classe de l'activité YourDeeplinkActivity :

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Traitement initial si l'activité est créée
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Il est important de mettre à jour l'Intent pour getIntent()
        setIntent(intent)
        // Traitement du nouvel Intent (deeplink)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // Logique de traitement de l'URI du deeplink
            Log.d("DeeplinkActivity", "Deeplink reçu : $uri")
            // Par exemple, extraire des paramètres et naviguer vers le fragment approprié
        }
    }
}

Le choix de l'approche dépend du scénario spécifique et du comportement souhaité dans la pile d'activités. La solution la plus courante pour les deeplinks menant à une activité existante est d'utiliser launchMode="singleTop" et de gérer cela dans onNewIntent().