Sobes.tech
Middle

Kaip elgtis, kai veikla atidaroma kelis kartus dėl deeplink?

sobes.tech AI

Atsakymas iš AI

Yra keletas požiūrių:

  1. Naudojant flag'us Intent'e:

    • FLAG_ACTIVITY_SINGLE_TOP: Jei veikla jau yra viršuje steko, kviečiama onNewIntent() metodas vietoje naujo egzemplioriaus sukūrimo.
    • FLAG_ACTIVITY_CLEAR_TOP: Jei veikla jau egzistuoja steke, visos virš jos esančios veiklos yra užbaigiamos, ir ji perkeliama į viršų.
    • Kombinuojant su FLAG_ACTIVITY_NEW_TASK: Dažnai naudojama su CLEAR_TOP darbui su veiklomis iš kitos užduoties.
  2. launchMode nustatymas AndroidManifest.xml:

    • singleTop: Panašiai kaip FLAG_ACTIVITY_SINGLE_TOP paleidžiant per Intent.
    • singleTask: Veikla yra naujos užduoties šaknis; jei ji jau egzistuoja, ji perkeliama į priekį, ir visos virš jos esančios veiklos yra užbaigiamos.
    • singleInstance: Veikla egzistuoja savo užduotyje ir yra vienintelė toje užduotyje.
  3. Veiklos egzistavimo patikrinimas prieš paleidžiant:

    • Naudokite ActivityManager patikrinti esamą veiklų steką. Šis metodas yra mažiau pageidaujamas dėl sudėtingumo ir išlaidų.
  4. Reakcija į onNewIntent():

    • Naudojant singleTop arba FLAG_ACTIVITY_SINGLE_TOP, visa deeplink apdorojimo logika turi būti įgyvendinta onNewIntent() metode, o ne onCreate(). Nepamirškite setIntent(intent) iškviesti onNewIntent() viduje, kad atnaujintumėte Intent.

Pavyzdys naudojant launchMode="singleTop" ir 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 klasėje:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Pradinė apdorojimas, jei aktyvumas kuriamas
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Svarbu atnaujinti Intent`ą `getIntent()` naudoti
        setIntent(intent)
        // Naujo Intent (deeplink) apdorojimas
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // URI deeplink apdorojimo logika
            Log.d("DeeplinkActivity", "Received deeplink: $uri")
            // Pavyzdžiui, parametrų išgavimas ir navigacija į reikiamą fragmentą
        }
    }
}

Pasirinkimas priklauso nuo konkretaus naudojimo scenarijaus ir norimo veiklos steko elgesio. Dažniausias sprendimas deeplink'ams, kurie veda į jau esamą aktyvumo egzempliorių — naudoti launchMode="singleTop" ir apdoroti onNewIntent().