Sobes.tech
Junior

Zašto se aktivnost ponovo kreira pri okretanju ekrana?

sobes.tech АИ

Одговор од АИ

Када се окрене екрана, конфигурацијата на уреѓајот се мења, на пример, ориентацијата. 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 или база на податоци за постојани податоци.

За да се избегне повторното создавање на активноста при окретање на екранот, може да се објави дека активноста сама ги обработува промените во конфигурацијата. Ова се прави во манифестот, додавајќи 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 за зачувување на податоците за состојбата.