Middle
Come gestire la situazione quando l'attività si apre più volte a causa di un deeplink?
sobes.tech AI
Risposta dell'AI
Esistono diversi approcci:
-
Utilizzo di flag nell'Intent:
FLAG_ACTIVITY_SINGLE_TOP: Se l'attività è già in cima alla pila, invece di crearne una nuova, verrà chiamatoonNewIntent().FLAG_ACTIVITY_CLEAR_TOP: Se l'attività esiste già nella pila, tutte le attività sopra di essa verranno terminate e l'attività verrà portata in cima.- In combinazione con
FLAG_ACTIVITY_NEW_TASK: Spesso usato conCLEAR_TOPper lavorare con attività di un'altra task.
-
Configurazione di
launchModein AndroidManifest.xml:singleTop: Simile aFLAG_ACTIVITY_SINGLE_TOPquando avviato tramiteIntent.singleTask: L'attività è la radice di una nuova task; se esiste già un'istanza in qualche task, verrà portata in avanti e tutte le attività sopra di essa terminate.singleInstance: L'attività esiste nel proprio task ed è l'unica attività in questa task.
-
Verifica dell'esistenza dell'attività prima di avviarla:
- Usa
ActivityManagerper verificare lo stack corrente delle attività. Questo approccio è meno preferito a causa della sua complessità e dei costi.
- Usa
-
Risposta a
onNewIntent():- Quando si utilizza
singleTopoFLAG_ACTIVITY_SINGLE_TOP, tutta la logica di gestione del deeplink deve essere implementata inonNewIntent(), non inonCreate(). Ricordarsi di chiamaresetIntent(intent)all'interno dionNewIntent()per aggiornare l'Intent accessibile tramitegetIntent().
- Quando si utilizza
Esempio di utilizzo di launchMode="singleTop" e onNewIntent():
Nel 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>
Nella classe dell'attività YourDeeplinkActivity:
class YourDeeplinkActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_deeplink)
// Elaborazione iniziale, se l'attività viene creata
handleIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// È importante aggiornare l'Intent
setIntent(intent)
// Elaborazione del nuovo Intent (deeplink)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
intent?.data?.let { uri ->
// Logica di elaborazione dell'URI del deeplink
Log.d("DeeplinkActivity", "Deeplink ricevuto: $uri")
// Ad esempio, estrarre parametri e navigare al frammento desiderato
}
}
}
La scelta dell'approccio dipende dallo scenario specifico e dal comportamento desiderato nella pila delle attività. La soluzione più comune per i deeplink che portano a un'attività già esistente è usare launchMode="singleTop" e gestirlo in onNewIntent().