Kodėl veikla kuriama iš naujo pasukus ekraną?
sobes.tech AI
Atsakymas iš AI
Kai ekrano vaizdas pasuka, keičiasi įrenginio konfigūracija, pavyzdžiui, orientacija. Android į tai reaguoja naikindamas ir iš naujo kuriant aktyvumo, kad būtų galima pritaikyti būtinus pakeitimus ištekliuose, tokiuose kaip layout failai, kurie yra specifiniai portreto ar peizažo orientacijai.
Aktyvumo gyvavimo ciklas pasukus ekraną:
onPause()onStop()onDestroy()- Sistema sukuria naują aktyvumo egzempliorių.
onCreate()onStart()onResume()
Norint išsaugoti būsenos duomenis prieš aktyvumo sunaikinimą, naudojami:
-
onSaveInstanceState(): išsaugo mažus duomenisBundleobjekte.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Išsaugome duomenis }Atkūrimas
onCreate()arbaonRestoreInstanceState():override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... if (savedInstanceState != null) { val myValue = savedInstanceState.getString("myKey") // Atkuriame duomenis } // ... } -
ViewModel: Išsaugo duomenis viso UI valdiklio (Activity/Fragment) gyvavimo ciklo metu, net ir keičiant konfigūraciją. ViewModel išgyvena aktyvumo sunaikinimą ir nepraranda būsenos.
class MyViewModel : ViewModel() { var counter = 0 }Naudojimas aktyvume/ar fragment'e:
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Dabar viewModel.counter išlieka pasukus ekraną } } -
Duomenų išsaugojimas SharedPreferences arba duomenų bazėje, siekiant ilgalaikio saugojimo.
Kad išvengtumėte aktyvumo iš naujo kūrimo pasukus ekraną, galite nurodyti, kad aktyvumas pats tvarko konfigūracijos pakeitimus. Tai daroma manifeste, pridedant atributą configChanges="orientation|screenSize|screenLayout" prie <activity> žymos:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout">
</activity>
Tokiu atveju, vietoj aktyvumo iš naujo kūrimo, bus iškviesta onConfigurationChanged() metodas:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Rankinis konfigūracijos keitimo valdymas
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Peizažo logika
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Portreto logika
}
}
Naudoti configChanges nerekomenduojama daugeliu atvejų, nes tai gali sukelti sudėtingumų valdyti būseną ir išteklius įvairių konfigūracijų pakeitimų metu. Pageidautinas būdas – naudoti ViewModel duomenų išsaugojimui.