Sobes.tech
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:

  1. Utilizzo di flag nell'Intent:

    • FLAG_ACTIVITY_SINGLE_TOP: Se l'attività è già in cima alla pila, invece di crearne una nuova, verrà chiamato onNewIntent().
    • 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 con CLEAR_TOP per lavorare con attività di un'altra task.
  2. Configurazione di launchMode in AndroidManifest.xml:

    • singleTop: Simile a FLAG_ACTIVITY_SINGLE_TOP quando avviato tramite Intent.
    • 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.
  3. Verifica dell'esistenza dell'attività prima di avviarla:

    • Usa ActivityManager per verificare lo stack corrente delle attività. Questo approccio è meno preferito a causa della sua complessità e dei costi.
  4. Risposta a onNewIntent():

    • Quando si utilizza singleTop o FLAG_ACTIVITY_SINGLE_TOP, tutta la logica di gestione del deeplink deve essere implementata in onNewIntent(), non in onCreate(). Ricordarsi di chiamare setIntent(intent) all'interno di onNewIntent() per aggiornare l'Intent accessibile tramite getIntent().

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().