Middle
Cum gestionezi situația când activitatea se deschide de mai multe ori din cauza unui deeplink?
sobes.tech AI
Răspuns de la AI
Există mai multe abordări:
-
Utilizarea steagurilor în Intent:
FLAG_ACTIVITY_SINGLE_TOP: Dacă activitatea se află deja în partea de sus a stivei, în loc să creeze o nouă instanță, se va apela metodaonNewIntent().FLAG_ACTIVITY_CLEAR_TOP: Dacă activitatea există deja în stivă, toate activitățile de deasupra vor fi închise și activitatea va fi adusă în partea de sus.- În combinație cu
FLAG_ACTIVITY_NEW_TASK: Se folosește adesea cuCLEAR_TOPpentru a lucra cu activități dintr-o altă sarcină.
-
Configurarea
launchModeîn AndroidManifest.xml:singleTop: Similar cuFLAG_ACTIVITY_SINGLE_TOPla lansarea prinIntent.singleTask: Activitatea este rădăcina unei noi sarcini; dacă există deja o instanță în vreo sarcină, va fi adusă în față, iar toate activitățile de deasupra vor fi închise.singleInstance: Activitatea există în propria sa sarcină și este singura activitate în acea sarcină.
-
Verificarea existenței activității înainte de a o porni:
- Folosiți
ActivityManagerpentru a verifica stiva curentă de activități. Această abordare este mai puțin preferată din cauza complexității și costurilor.
- Folosiți
-
Reacția la
onNewIntent():- Când se folosește
singleTopsauFLAG_ACTIVITY_SINGLE_TOP, întreaga logică de gestionare a deeplink-ului trebuie implementată înonNewIntent(), nu înonCreate(). Nu uitați să apelațisetIntent(intent)înonNewIntent()pentru a actualiza Intent-ul accesibil pringetIntent().
- Când se folosește
Exemplu de utilizare a launchMode="singleTop" și onNewIntent():
În 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>
În clasa activității YourDeeplinkActivity:
class YourDeeplinkActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_deeplink)
// Procesare inițială, dacă activitatea este creată
handleIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// Este important să actualizați Intent-ul
setIntent(intent)
// Procesarea noului Intent (deeplink)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
intent?.data?.let { uri ->
// Logica de procesare a URI-ului deeplink
Log.d("DeeplinkActivity", "Deeplink primit: $uri")
// De exemplu, extragerea parametrilor și navigarea către fragmentul dorit
}
}
}
Alegerea abordării depinde de scenariul specific și de comportamentul dorit în stiva de activități. Soluția cea mai comună pentru deeplinks care duc la o activitate deja existentă este utilizarea launchMode="singleTop" și gestionarea în onNewIntent().