Sobes.tech
Middle

Kako se nositi sa situacijom kada se aktivnost otvara više puta zbog deeplink-a?

sobes.tech АИ

Одговор од АИ

Postoji nekoliko pristupa:

  1. Korišćenje flagova u Intentu:

    • FLAG_ACTIVITY_SINGLE_TOP: Ako je aktivnost već na vrhu steka, pozvaće se metoda onNewIntent() umesto kreiranja novog primera.
    • FLAG_ACTIVITY_CLEAR_TOP: Ako aktivnost već postoji u steku, sve aktivnosti iznad nje će biti završene, a ona će biti prebačena na vrh.
    • U kombinaciji sa FLAG_ACTIVITY_NEW_TASK: Često se koristi sa CLEAR_TOP za rad sa aktivnostima iz drugog zadatka.
  2. Podešavanje launchMode u AndroidManifest.xml:

    • singleTop: Slično FLAG_ACTIVITY_SINGLE_TOP pri pokretanju putem Intent.
    • singleTask: Aktivnost je koren novog zadatka; ako već postoji njen primer u nekom zadatku, ona će biti prebačena napred, a sve aktivnosti iznad nje će biti završene.
    • singleInstance: Aktivnost postoji u sopstvenom zadatku i jedina je aktivnost u tom zadatku.
  3. Provera postojanja aktivnosti pre pokretanja:

    • Koristite ActivityManager za proveru trenutnog steka aktivnosti. Ovaj pristup je manje poželjan zbog složenosti i troškova.
  4. Reakcija na onNewIntent():

    • Kada koristite singleTop ili FLAG_ACTIVITY_SINGLE_TOP, cela logika obrade deeplink-a treba biti implementirana u metodu onNewIntent(), a ne u onCreate(). Ne zaboravite da pozovete setIntent(intent) unutar onNewIntent() za ažuriranje Intenta.

Primer korišćenja launchMode="singleTop" i onNewIntent():

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

U klasi aktivnosti YourDeeplinkActivity:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Početna obrada, ako se aktivnost kreira
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Važno je ažurirati Intent za getIntent()
        setIntent(intent)
        // Obrada novog Intent-a (deeplink)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // Logika obrade URI deeplink-a
            Log.d("DeeplinkActivity", "Received deeplink: $uri")
            // Na primer, izvlačenje parametara i navigacija do odgovarajućeg fragmenta
        }
    }
}

Izbor pristupa zavisi od konkretnog scenarija korišćenja i željenog ponašanja steka aktivnosti. Najčešće rešenje za deeplinkove koji vode do već postojeće aktivnosti je korišćenje launchMode="singleTop" i obrada u onNewIntent().