Middle
Kuidas toime tulla olukorraga, kui tegevus avatakse mitu korda deeplink'i tõttu?
sobes.tech AI
Vastus AI-lt
On olemas mitu lähenemisviisi:
-
Kasutades Intenti lippe:
FLAG_ACTIVITY_SINGLE_TOP: Kui tegevus on juba steki tipus ülaosas, siis uue eksemplari asemel kutsutakse väljaonNewIntent()meetod.FLAG_ACTIVITY_CLEAR_TOP: Kui tegevus on juba stekis olemas, kõik selle kohal olevad tegevused lõpetatakse ja see viiakse steki tippu.- Kombineerituna
FLAG_ACTIVITY_NEW_TASK-ga: Kasutatakse sageli koosCLEAR_TOP-ga, et töötada teise ülesandega.
-
launchModeseadistamine AndroidManifest.xml-s:singleTop: SarnaneFLAG_ACTIVITY_SINGLE_TOP-ga käivitamiselIntent-iga.singleTask: Tegevus on uue ülesande juur; kui eksemplar juba eksisteerib mõnes ülesandes, see viiakse ettepoole ja kõik selle kohal olevad tegevused lõpetatakse.singleInstance: Tegevus eksisteerib oma ülesandes ja on selle ülesande ainus tegevus.
-
Tegevuse olemasolu kontroll enne käivitamist:
- Kasutage
ActivityManager-it, et kontrollida praegust tegevuste steki. See lähenemine on vähem soovitatav, kuna see on keerulisem ja nõuab rohkem ressursse.
- Kasutage
-
Reageerimine
onNewIntent()-le:- Kasutades
singleTopvõiFLAG_ACTIVITY_SINGLE_TOP, kogu deeplinkide töötlemise loogika peaks olema realiseeritudonNewIntent()-s, mitteonCreate()-s. Ärge unustage kutsudasetIntent(intent)onNewIntent()-s, et uuendadaIntent-i, mis on kättesaadavgetIntent()kaudu.
- Kasutades
Näide kasutades launchMode="singleTop" ja 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 klass:
class YourDeeplinkActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_deeplink)
// Alguslik töötlemine, kui tegevus luuakse
handleIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// Oluline on uuendada Intent, et `getIntent()` oleks ajakohane
setIntent(intent)
// Uue Intenti (deeplink) töötlemine
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
intent?.data?.let { uri ->
// Deeplink URI töötlemise loogika
Log.d("DeeplinkActivity", "Saadud deeplink: $uri")
// Näiteks parameetrite väljavõtmine ja navigeerimine vajaliku fragmenti juurde
}
}
}