Middle
Kako se nositi sa situacijom kada se aktivnost otvara više puta zbog deeplink-a?
sobes.tech АИ
Одговор од АИ
Postoji nekoliko pristupa:
-
Korišćenje flagova u Intentu:
FLAG_ACTIVITY_SINGLE_TOP: Ako je aktivnost već na vrhu steka, pozvaće se metodaonNewIntent()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 saCLEAR_TOPza rad sa aktivnostima iz drugog zadatka.
-
Podešavanje
launchModeu AndroidManifest.xml:singleTop: SličnoFLAG_ACTIVITY_SINGLE_TOPpri pokretanju putemIntent.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.
-
Provera postojanja aktivnosti pre pokretanja:
- Koristite
ActivityManagerza proveru trenutnog steka aktivnosti. Ovaj pristup je manje poželjan zbog složenosti i troškova.
- Koristite
-
Reakcija na
onNewIntent():- Kada koristite
singleTopiliFLAG_ACTIVITY_SINGLE_TOP, cela logika obrade deeplink-a treba biti implementirana u metoduonNewIntent(), a ne uonCreate(). Ne zaboravite da pozovetesetIntent(intent)unutaronNewIntent()za ažuriranje Intenta.
- Kada koristite
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().