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 активдүүлүктүн жок кылуусунан өтөт жана анын абалын жоготпойт.

    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 же базада сактоо, көбүрөөк туруктуу маалыматтар үчүн.

Экран бурулганда активдүүлүктү кайра түзүүнү болтурбоо үчүн, активдүүлүк конфигурация өзгөрүүлөрүн өзү иштетет деп белгилөө мүмкүн. Бул манифестте <activity> тегине configChanges="orientation|screenSize|screenLayout" атрибутун кошуу менен жасалат:

<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 колдонуу аркылуу абал маалыматтарын сактоо.