Miks tegevus taaskasutatakse ekraani pööramisel?
sobes.tech AI
Vastus AI-lt
Ekraani pööramisel muutub seadme konfiguratsioon, näiteks orientatsioon. Android reageerib sellele, hävitades ja seejärel uuesti luues tegevuse, et rakendada vajalikud muudatused ressurssides, nagu paigutusfailid, mis on spetsiifilised portree- või maastikuorientatsioonile.
Tegevuse elutsükkel pöörde ajal:
onPause()onStop()onDestroy()- Süsteem loob uue tegevuse eksemplari.
onCreate()onStart()onResume()
Andmete salvestamiseks enne tegevuse hävitamist kasutatakse:
-
onSaveInstanceState(): salvestab väikeseid andmeidBundle'i.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Andmete salvestamine }Taastamine
onCreate()võionRestoreInstanceState():override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... if (savedInstanceState != null) { val myValue = savedInstanceState.getString("myKey") // Andmete taastamine } // ... } -
ViewModel: Salvestab andmeid kogu UI-kontrollija (Activity/Fragment) elutsükli jooksul, isegi konfiguratsiooni muutmisel. ViewModel ellujääb tegevuse hävitamise ja ei kaota oma olekut.
class MyViewModel : ViewModel() { var counter = 0 }Kasutamine tegevuses/fragmentis:
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Nüüd säilib viewModel.counter pöörde ajal } } -
Andmete salvestamine SharedPreferences või andmebaasi, et tagada pikemaajaline säilitamine.
Et vältida tegevuse uuesti loomist ekraani pööramisel, saab määrata, et tegevus ise käsitleb konfiguratsiooni muutusi. Seda tehakse manifestis, lisades <activity> sildile configChanges="orientation|screenSize|screenLayout" atribuudi:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout">
</activity>
Sellisel juhul, mitte tegevuse uuesti loomise asemel, kutsutakse välja onConfigurationChanged() meetod:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Konfiguratsiooni muutuste käsitlemine käsitsi
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Maastiku orientatsiooni loogika
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Portree orientatsiooni loogika
}
}
configChanges kasutamine ei ole soovitatav enamikul juhtudel, kuna see võib põhjustada keerukusi oleku ja ressursside haldamisel erinevate konfiguratsioonimuutuste ajal. Eelistatud lähenemine on kasutada ViewModeli oleku andmete salvestamiseks.