Middle
Kā rīkoties, ja aktivitāte tiek atvērta vairākas reizes dēļ deeplink?
sobes.tech AI
Atbilde no AI
Ir vairākas pieejas:
-
Izmantojot flagus Intent:
FLAG_ACTIVITY_SINGLE_TOP: Ja aktivitāte jau atrodas steka augšpusē, tad vietā, lai izveidotu jaunu eksemplāru, tiks izsaukta metodeonNewIntent().FLAG_ACTIVITY_CLEAR_TOP: Ja aktivitāte jau pastāv stekā, visas aktivitātes virs tās tiks aizvērtas, un tā tiks novietota uz steka augšas.- Kombinācijā ar
FLAG_ACTIVITY_NEW_TASK: Bieži tiek izmantots arCLEAR_TOP, lai strādātu ar aktivitātēm no citas uzdevuma.
-
launchModekonfigurācija AndroidManifest.xml:singleTop: Līdzīgi kāFLAG_ACTIVITY_SINGLE_TOPpalaišanas laikā arIntent.singleTask: Aktivitāte ir jaunas uzdevuma sakne; ja eksemplārs jau pastāv kādā uzdevumā, tas tiks pārvietots uz priekšu, un visas aktivitātes virs tās tiks aizvērtas.singleInstance: Aktivitāte pastāv savā uzdevumā un ir vienīgā aktivitāte šajā uzdevumā.
-
Aktivitātes eksistences pārbaude pirms palaišanas:
- Izmantojiet
ActivityManager, lai pārbaudītu pašreizējo aktivitāšu steku. Šī pieeja ir mazāk ieteicama, jo tā ir sarežģītāka un rada papildu slodzi.
- Izmantojiet
-
Reakcija uz
onNewIntent():- Izmantojot
singleTopvaiFLAG_ACTIVITY_SINGLE_TOP, visa deeplink apstrādes loģika jārealizēonNewIntent()metodē, nevisonCreate(). Neaizmirstiet izsauktsetIntent(intent)onNewIntent()iekšienē, lai atjauninātuIntent, kas ir pieejams caurgetIntent().
- Izmantojot
Piemērs, izmantojot launchMode="singleTop" un 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 klases kods:
class YourDeeplinkActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_deeplink)
// Sākotnējā apstrāde, ja aktivitāte tiek izveidota
handleIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// Ir svarīgi atjaunināt Intent, lai `getIntent()` būtu aktuāls
setIntent(intent)
// Jauna Intent apstrāde (deeplink)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
intent?.data?.let { uri ->
// Deeplink URI apstrādes loģika
Log.d("DeeplinkActivity", "Saņemts deeplink: $uri")
// Piemēram, parametru izvilkšana un navigācija uz vajadzīgo fragmentu
}
}
}
Izvēle ir atkarīga no konkrētā lietošanas scenārija un vēlamās aktivitāšu steka uzvedības. Visbiežāk izmantotā pieeja deeplinkiem, kas ved uz jau esošu aktivitāti, ir launchMode="singleTop" un apstrāde onNewIntent() metodē.