Middle
Ako zvládnuť situáciu, keď sa aktivita otvára niekoľkokrát kvôli deeplink?
sobes.tech AI
Odpoveď od AI
Existuje niekoľko prístupov:
-
Použitie flagov v Intent:
FLAG_ACTIVITY_SINGLE_TOP: Ak je aktivita už na vrchu zásobníka, volá sa metódaonNewIntent()namiesto vytvorenia nového inštancie.FLAG_ACTIVITY_CLEAR_TOP: Ak aktivita už existuje v zásobníku, všetky nad ňou sa ukončia a aktivita sa presunie na vrch.- V kombinácii s
FLAG_ACTIVITY_NEW_TASK: Často sa používa sCLEAR_TOPna prácu s aktivitami z iného úlohy.
-
Nastavenie
launchModev AndroidManifest.xml:singleTop: Podobne akoFLAG_ACTIVITY_SINGLE_TOPpri spustení cezIntent.singleTask: Aktivita je koreňom nového úlohy; ak už existuje jej inštancia v nejakom úlohe, je presunutá dopredu a všetky aktivity nad ňou sú ukončené.singleInstance: Aktivita existuje vo vlastnej úlohe a je jedinou aktivitou v tejto úlohe.
-
Kontrola existencie aktivity pred spustením:
- Použite
ActivityManagerna kontrolu aktuálneho zásobníka aktivít. Tento prístup je menej preferovaný kvôli zložitosti a režii.
- Použite
-
Reakcia na
onNewIntent():- Pri použití
singleTopaleboFLAG_ACTIVITY_SINGLE_TOPby mala byť celá logika spracovania deeplink implementovaná v metódeonNewIntent(), nie vonCreate(). Nezabudnite volaťsetIntent(intent)vo vnútrionNewIntent()na aktualizáciu Intentu.
- Pri použití
Príklad použitia launchMode="singleTop" a onNewIntent():
V 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>
V triede YourDeeplinkActivity:
class YourDeeplinkActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_deeplink)
// Počiatočné spracovanie, ak sa aktivita vytvára
handleIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// Je dôležité aktualizovať Intent pre getIntent()
setIntent(intent)
// Spracovanie nového Intentu (deeplink)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
intent?.data?.let { uri ->
// Logika spracovania URI deeplink
Log.d("DeeplinkActivity", "Received deeplink: $uri")
// Napríklad extrakcia parametrov a navigácia na požadovaný fragment
}
}
}
Výber prístupu závisí od konkrétneho scenára použitia a požadovaného správania zásobníka aktivít. Najbežnejším riešením pre deeplink, ktoré vedú na už existujúcu aktivitu, je použitie launchMode="singleTop" a spracovanie v onNewIntent().