Защо се създава отново активността при завъртане на екрана?
sobes.tech AI
Отговор от AI
Когато се завърти екрана, конфигурацията на устройството се променя, например ориентацията. Android реагира на това чрез унищожаване и повторно създаване на активността, за да приложи необходимите промени в ресурсите, като файлове за оформление, специфични за портретна или пейзажна ориентация.
Жизненият цикъл на активността при завъртане:
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 оцелява унищожаването на активността и не губи състоянието си.
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 за запазване на данните за състоянието.