Sobes.tech
Middle

Kuidas toime tulla olukorraga, kui tegevus avatakse mitu korda deeplink'i tõttu?

sobes.tech AI

Vastus AI-lt

On olemas mitu lähenemisviisi:

  1. Kasutades Intenti lippe:

    • FLAG_ACTIVITY_SINGLE_TOP: Kui tegevus on juba steki tipus ülaosas, siis uue eksemplari asemel kutsutakse välja onNewIntent() meetod.
    • FLAG_ACTIVITY_CLEAR_TOP: Kui tegevus on juba stekis olemas, kõik selle kohal olevad tegevused lõpetatakse ja see viiakse steki tippu.
    • Kombineerituna FLAG_ACTIVITY_NEW_TASK-ga: Kasutatakse sageli koos CLEAR_TOP-ga, et töötada teise ülesandega.
  2. launchMode seadistamine AndroidManifest.xml-s:

    • singleTop: Sarnane FLAG_ACTIVITY_SINGLE_TOP-ga käivitamisel Intent-iga.
    • singleTask: Tegevus on uue ülesande juur; kui eksemplar juba eksisteerib mõnes ülesandes, see viiakse ettepoole ja kõik selle kohal olevad tegevused lõpetatakse.
    • singleInstance: Tegevus eksisteerib oma ülesandes ja on selle ülesande ainus tegevus.
  3. Tegevuse olemasolu kontroll enne käivitamist:

    • Kasutage ActivityManager-it, et kontrollida praegust tegevuste steki. See lähenemine on vähem soovitatav, kuna see on keerulisem ja nõuab rohkem ressursse.
  4. Reageerimine onNewIntent()-le:

    • Kasutades singleTop või FLAG_ACTIVITY_SINGLE_TOP, kogu deeplinkide töötlemise loogika peaks olema realiseeritud onNewIntent()-s, mitte onCreate()-s. Ärge unustage kutsuda setIntent(intent) onNewIntent()-s, et uuendada Intent-i, mis on kättesaadav getIntent() kaudu.

Näide kasutades launchMode="singleTop" ja onNewIntent():

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>

YourDeeplinkActivity klass:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Alguslik töötlemine, kui tegevus luuakse
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Oluline on uuendada Intent, et `getIntent()` oleks ajakohane
        setIntent(intent)
        // Uue Intenti (deeplink) töötlemine
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // Deeplink URI töötlemise loogika
            Log.d("DeeplinkActivity", "Saadud deeplink: $uri")
            // Näiteks parameetrite väljavõtmine ja navigeerimine vajaliku fragmenti juurde
        }
    }
}