Ինչու է ակտիվությունը կրկին ստեղծվում է էկրանի պտտման ժամանակ?
sobes.tech AI
Պատասխան AI-ից
Երբ էկրանը շրջվում է, սարքի կոնֆիգուրացիան փոխվում է, օրինակ՝ ուղղությունը։ Android-ը արձագանքում է դրան՝ ոչնչացնելով և նորից ստեղծելով ակտիվությունը՝ անհրաժեշտ փոփոխությունները ռեսուրսներում, ինչպիսիք են layout-ֆայլերը, որոնք հատուկ են պորտրեյտ կամ լանդշաֆտ ուղղությանը, կիրառելու համար:
Ակտիվության կյանքի ցիկլը շրջադարձի ժամանակ՝
onPause()onStop()onDestroy()- Սիստեմը ստեղծում է նոր ակտիվության օրինակ:
onCreate()onStart()onResume()
Նախքան ակտիվությունը ոչնչացնելուց առաջ տվյալների պահպանման համար օգտագործվում են՝
-
onSaveInstanceState(): պահում է փոքր տվյալներBundle-ում:override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Տվյալների պահպանում }Վերականգնում
onCreate()կամonRestoreInstanceState()-ում՝override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... if (savedInstanceState != null) { val myValue = savedInstanceState.getString("myKey") // Տվյալների վերականգնում } // ... } -
ViewModel՝ պահում է տվյալները ամբողջ UI-կոնտրոլերի (Activity/Fragment) կյանքի ընթացքում, նույնիսկ կոնֆիգուրացիայի փոփոխության դեպքում։ ViewModel-ը survives է ակտիվության ոչնչացմանը և չի կորցնում իր վիճակը:
class MyViewModel : ViewModel() { var counter = 0 }Օգտագործում ակտիվությունում/ֆրագմենտում՝
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Այժմ viewModel.counter-ը պահպանվում է շրջադարձի ժամանակ } } -
Տվյալների պահպանման համար օգտագործել SharedPreferences կամ տվյալների բազա՝ ավելի կայուն տվյալների համար:
Որպեսզի խուսափել ակտիվության կրկնակի ստեղծումից էկրանն շրջելիս, կարելի է հայտարարել, որ ակտիվությունը ինքնուրույն կառավարում է կոնֆիգուրացիայի փոփոխությունները։ Դա կատարվում է մանիֆեստում՝ ավելացնելով configChanges="orientation|screenSize|screenLayout" ատրիբուտը <activity> տեգին:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout">
</activity>
Այդ դեպքում, ակտիվությունը չի վերականգնվի, փոխարենը կկոչվի onConfigurationChanged() մեթոդը՝
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Կառավարել կոնֆիգուրացիայի փոփոխությունը ձեռքով
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Լոգիկա լանդշաֆտային ուղղության համար
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Լոգիկա պորտրեյտի համար
}
}
configChanges-ի օգտագործումը չի խորհուրդ տրվում մեծ մասամբ, քանի որ դա կարող է բարդացնել վիճակի և ռեսուրսների կառավարումը տարբեր կոնֆիգուրացիաների փոփոխությունների ժամանակ։ Առաջնահերթը՝ օգտագործել ViewModel՝ վիճակի տվյալները պահպանելու համար։