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

  1. Použitie flagov v Intent:

    • FLAG_ACTIVITY_SINGLE_TOP: Ak je aktivita už na vrchu zásobníka, volá sa metóda onNewIntent() 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 s CLEAR_TOP na prácu s aktivitami z iného úlohy.
  2. Nastavenie launchMode v AndroidManifest.xml:

    • singleTop: Podobne ako FLAG_ACTIVITY_SINGLE_TOP pri spustení cez Intent.
    • 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.
  3. Kontrola existencie aktivity pred spustením:

    • Použite ActivityManager na kontrolu aktuálneho zásobníka aktivít. Tento prístup je menej preferovaný kvôli zložitosti a režii.
  4. Reakcia na onNewIntent():

    • Pri použití singleTop alebo FLAG_ACTIVITY_SINGLE_TOP by mala byť celá logika spracovania deeplink implementovaná v metóde onNewIntent(), nie v onCreate(). Nezabudnite volať setIntent(intent) vo vnútri onNewIntent() na aktualizáciu Intentu.

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