Sobes.tech
Junior

Ինչու է ակտիվությունը կրկին ստեղծվում է էկրանի պտտման ժամանակ?

sobes.tech AI

Պատասխան AI-ից

Երբ էկրանը շրջվում է, սարքի կոնֆիգուրացիան փոխվում է, օրինակ՝ ուղղությունը։ Android-ը արձագանքում է դրան՝ ոչնչացնելով և նորից ստեղծելով ակտիվությունը՝ անհրաժեշտ փոփոխությունները ռեսուրսներում, ինչպիսիք են layout-ֆայլերը, որոնք հատուկ են պորտրեյտ կամ լանդշաֆտ ուղղությանը, կիրառելու համար:

Ակտիվության կյանքի ցիկլը շրջադարձի ժամանակ՝

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Սիստեմը ստեղծում է նոր ակտիվության օրինակ:
  5. onCreate()
  6. onStart()
  7. 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՝ վիճակի տվյալները պահպանելու համար։