Sobes.tech
Middle

Cum gestionezi situația când activitatea se deschide de mai multe ori din cauza unui deeplink?

sobes.tech AI

Răspuns de la AI

Există mai multe abordări:

  1. Utilizarea steagurilor în Intent:

    • FLAG_ACTIVITY_SINGLE_TOP: Dacă activitatea se află deja în partea de sus a stivei, în loc să creeze o nouă instanță, se va apela metoda onNewIntent().
    • FLAG_ACTIVITY_CLEAR_TOP: Dacă activitatea există deja în stivă, toate activitățile de deasupra vor fi închise și activitatea va fi adusă în partea de sus.
    • În combinație cu FLAG_ACTIVITY_NEW_TASK: Se folosește adesea cu CLEAR_TOP pentru a lucra cu activități dintr-o altă sarcină.
  2. Configurarea launchMode în AndroidManifest.xml:

    • singleTop: Similar cu FLAG_ACTIVITY_SINGLE_TOP la lansarea prin Intent.
    • singleTask: Activitatea este rădăcina unei noi sarcini; dacă există deja o instanță în vreo sarcină, va fi adusă în față, iar toate activitățile de deasupra vor fi închise.
    • singleInstance: Activitatea există în propria sa sarcină și este singura activitate în acea sarcină.
  3. Verificarea existenței activității înainte de a o porni:

    • Folosiți ActivityManager pentru a verifica stiva curentă de activități. Această abordare este mai puțin preferată din cauza complexității și costurilor.
  4. Reacția la onNewIntent():

    • Când se folosește singleTop sau FLAG_ACTIVITY_SINGLE_TOP, întreaga logică de gestionare a deeplink-ului trebuie implementată în onNewIntent(), nu în onCreate(). Nu uitați să apelați setIntent(intent) în onNewIntent() pentru a actualiza Intent-ul accesibil prin getIntent().

Exemplu de utilizare a launchMode="singleTop" și onNewIntent():

În 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>

În clasa activității YourDeeplinkActivity:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Procesare inițială, dacă activitatea este creată
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Este important să actualizați Intent-ul
        setIntent(intent)
        // Procesarea noului Intent (deeplink)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // Logica de procesare a URI-ului deeplink
            Log.d("DeeplinkActivity", "Deeplink primit: $uri")
            // De exemplu, extragerea parametrilor și navigarea către fragmentul dorit
        }
    }
}

Alegerea abordării depinde de scenariul specific și de comportamentul dorit în stiva de activități. Soluția cea mai comună pentru deeplinks care duc la o activitate deja existentă este utilizarea launchMode="singleTop" și gestionarea în onNewIntent().