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 :
-
Utilisation des drapeaux dans Intent :
FLAG_ACTIVITY_SINGLE_TOP: Si l'activité est déjà en haut de la pile, la méthodeonNewIntent()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é avecCLEAR_TOPpour gérer les activités d'une autre tâche.
-
Configuration du
launchModedans AndroidManifest.xml :singleTop: Semblable àFLAG_ACTIVITY_SINGLE_TOPlors du lancement viaIntent.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.
-
Vérification de l'existence de l'activité avant de la lancer :
- Utilisez
ActivityManagerpour 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.
- Utilisez
-
Réaction à
onNewIntent():- Lorsqu'on utilise
singleTopouFLAG_ACTIVITY_SINGLE_TOP, toute la logique de traitement du deeplink doit être implémentée dansonNewIntent(), et non dansonCreate(). N'oubliez pas d'appelersetIntent(intent)dansonNewIntent()pour mettre à jour l'Intent accessible viagetIntent().
- Lorsqu'on utilise
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().