Middle
Kaip elgtis, kai veikla atidaroma kelis kartus dėl deeplink?
sobes.tech AI
Atsakymas iš AI
Yra keletas požiūrių:
-
Naudojant flag'us Intent'e:
FLAG_ACTIVITY_SINGLE_TOP: Jei veikla jau yra viršuje steko, kviečiamaonNewIntent()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 suCLEAR_TOPdarbui su veiklomis iš kitos užduoties.
-
launchModenustatymas AndroidManifest.xml:singleTop: Panašiai kaipFLAG_ACTIVITY_SINGLE_TOPpaleidžiant perIntent.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.
-
Veiklos egzistavimo patikrinimas prieš paleidžiant:
- Naudokite
ActivityManagerpatikrinti esamą veiklų steką. Šis metodas yra mažiau pageidaujamas dėl sudėtingumo ir išlaidų.
- Naudokite
-
Reakcija į
onNewIntent():- Naudojant
singleToparbaFLAG_ACTIVITY_SINGLE_TOP, visa deeplink apdorojimo logika turi būti įgyvendintaonNewIntent()metode, o neonCreate(). NepamirškitesetIntent(intent)iškviestionNewIntent()viduje, kad atnaujintumėte Intent.
- Naudojant
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().