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:
-
Intent flag-ek használata:
FLAG_ACTIVITY_SINGLE_TOP: Ha az aktivitás már a verem tetején van, azonNewIntent()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 aCLEAR_TOP-mal más feladatból származó aktivitások kezelésére.
-
launchModebeállítása az AndroidManifest.xml-ben:singleTop: Hasonló aFLAG_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.
-
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.
- Használja az
-
Reagálás az
onNewIntent()-re:singleTopvagyFLAG_ACTIVITY_SINGLE_TOPhasználatakor az összes deeplink feldolgozási logikát azonNewIntent()-ben kell megvalósítani, nem azonCreate()-ben. Ne felejtse el meghívni asetIntent(intent)-et azonNewIntent()-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.