Sobes.tech
Middle

Kā rīkoties, ja aktivitāte tiek atvērta vairākas reizes dēļ deeplink?

sobes.tech AI

Atbilde no AI

Ir vairākas pieejas:

  1. Izmantojot flagus Intent:

    • FLAG_ACTIVITY_SINGLE_TOP: Ja aktivitāte jau atrodas steka augšpusē, tad vietā, lai izveidotu jaunu eksemplāru, tiks izsaukta metode onNewIntent().
    • FLAG_ACTIVITY_CLEAR_TOP: Ja aktivitāte jau pastāv stekā, visas aktivitātes virs tās tiks aizvērtas, un tā tiks novietota uz steka augšas.
    • Kombinācijā ar FLAG_ACTIVITY_NEW_TASK: Bieži tiek izmantots ar CLEAR_TOP, lai strādātu ar aktivitātēm no citas uzdevuma.
  2. launchMode konfigurācija AndroidManifest.xml:

    • singleTop: Līdzīgi kā FLAG_ACTIVITY_SINGLE_TOP palaišanas laikā ar Intent.
    • singleTask: Aktivitāte ir jaunas uzdevuma sakne; ja eksemplārs jau pastāv kādā uzdevumā, tas tiks pārvietots uz priekšu, un visas aktivitātes virs tās tiks aizvērtas.
    • singleInstance: Aktivitāte pastāv savā uzdevumā un ir vienīgā aktivitāte šajā uzdevumā.
  3. Aktivitātes eksistences pārbaude pirms palaišanas:

    • Izmantojiet ActivityManager, lai pārbaudītu pašreizējo aktivitāšu steku. Šī pieeja ir mazāk ieteicama, jo tā ir sarežģītāka un rada papildu slodzi.
  4. Reakcija uz onNewIntent():

    • Izmantojot singleTop vai FLAG_ACTIVITY_SINGLE_TOP, visa deeplink apstrādes loģika jārealizē onNewIntent() metodē, nevis onCreate(). Neaizmirstiet izsaukt setIntent(intent) onNewIntent() iekšienē, lai atjauninātu Intent, kas ir pieejams caur getIntent().

Piemērs, izmantojot launchMode="singleTop" un 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 klases kods:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Sākotnējā apstrāde, ja aktivitāte tiek izveidota
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Ir svarīgi atjaunināt Intent, lai `getIntent()` būtu aktuāls
        setIntent(intent)
        // Jauna Intent apstrāde (deeplink)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // Deeplink URI apstrādes loģika
            Log.d("DeeplinkActivity", "Saņemts deeplink: $uri")
            // Piemēram, parametru izvilkšana un navigācija uz vajadzīgo fragmentu
        }
    }
}

Izvēle ir atkarīga no konkrētā lietošanas scenārija un vēlamās aktivitāšu steka uzvedības. Visbiežāk izmantotā pieeja deeplinkiem, kas ved uz jau esošu aktivitāti, ir launchMode="singleTop" un apstrāde onNewIntent() metodē.