Sobes.tech
Middle

Hogyan kezeljük azt a helyzetet, amikor egy tevékenység többször nyílik meg a deeplink miatt?

sobes.tech MI

Válasz az MI-től

Különböző megközelítések léteznek:

  1. Intent flag-ek használata:

    • FLAG_ACTIVITY_SINGLE_TOP: Ha az aktivitás már a verem tetején van, az onNewIntent() metódus hívódik meg ahelyett, hogy új példány jönne létre.
    • FLAG_ACTIVITY_CLEAR_TOP: Ha az aktivitás már létezik a veremben, minden fölötte lévő aktivitás befejeződik, és az aktivitás a tetejére kerül.
    • Kombinálva FLAG_ACTIVITY_NEW_TASK-val: Gyakran használják a CLEAR_TOP-mal más feladatból származó aktivitások kezelésére.
  2. launchMode beállítása az AndroidManifest.xml-ben:

    • singleTop: Hasonló a FLAG_ACTIVITY_SINGLE_TOP-hoz indításkor.
    • singleTask: Az aktivitás egy új feladat gyökere; ha már létezik példány, az előre kerül, és minden fölötte lévő aktivitás befejeződik.
    • singleInstance: Az aktivitás saját feladatában létezik, és az egyetlen aktivitás ebben a feladatban.
  3. Az aktivitás létezésének ellenőrzése indítás előtt:

    • Használja az ActivityManager-t az aktuális verem ellenőrzésére. Ez a megközelítés kevésbé ajánlott bonyolultsága és overhead miatt.
  4. Reagálás az onNewIntent()-re:

    • singleTop vagy FLAG_ACTIVITY_SINGLE_TOP használatakor az összes deeplink feldolgozási logikát az onNewIntent()-ben kell megvalósítani, nem az onCreate()-ben. Ne felejtse el meghívni a setIntent(intent)-et az onNewIntent()-ben az Intent frissítéséhez.

Példa a launchMode="singleTop" és onNewIntent() használatára:

Az AndroidManifest.xml-ben:

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

Az YourDeeplinkActivity osztályban:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Kezdeti feldolgozás, ha az aktivitás létrejön
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Fontos az Intent frissítése a getIntent()-hez
        setIntent(intent)
        // Új Intent (deeplink) feldolgozása
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // URI deeplink feldolgozási logika
            Log.d("DeeplinkActivity", "Received deeplink: $uri")
            // Például paraméterek kinyerése és navigáció a megfelelő fragmenthez
        }
    }
}

A megközelítés kiválasztása a konkrét használati szcenáriótól és a kívánt aktivitás verem viselkedéstől függ. A leggyakoribb megoldás a deeplinkek esetében, amelyek egy már létező aktivitáshoz vezetnek, a launchMode="singleTop" használata és az onNewIntent()-ben való feldolgozás.