Ekran döndürüldükdə niyə fəaliyyət yenidən yaradılır?
sobes.tech Süni İntellekt
AI-dan cavab
Ekran döndürüldükdə, cihazın konfiqurasiyası dəyişir, məsələn, istiqamət. Android buna cavab olaraq, lazım olan dəyişiklikləri tətbiq etmək üçün fəaliyyəti məhv edir və yenidən yaradır, məsələn, portret və ya landşaft istiqamətinə xas layout faylları.
Döndürmə zamanı fəaliyyətin həyat dövrü:
onPause()onStop()onDestroy()- Sistem yeni fəaliyyət nümunəsi yaradır.
onCreate()onStart()onResume()
Fəaliyyətin məhvinə qədər vəziyyət məlumatlarını saxlamaq üçün istifadə olunur:
-
onSaveInstanceState(): kiçik məlumatlarıBundle-də saxlayır.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Məlumatları saxlamaq }onCreate()və yaonRestoreInstanceState()-də bərpa:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... if (savedInstanceState != null) { val myValue = savedInstanceState.getString("myKey") // Məlumatları bərpa et } // ... } -
ViewModel: UI nəzarətçisinin (Activity/Fragment) həyat dövrü boyunca, konfiqurasiya dəyişsə belə, məlumatları saxlayır. ViewModel fəaliyyətin məhvinə tab gətirir və vəziyyətini itirmir.
class MyViewModel : ViewModel() { var counter = 0 }Fəaliyyətdə/fragmentdə istifadə:
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // İndi viewModel.counter döndərmə zamanı saxlanılır } } -
Məlumatları SharedPreferences və ya verilənlər bazasında saxlamaq üçün.
Ekran döndəriləndə fəaliyyətin yenidən yaradılmasının qarşısını almaq üçün, fəaliyyətin konfiqurasiya dəyişikliklərini özü idarə etdiyini elan edə bilərsiniz. Bu, manifestdə <activity> teqi içində configChanges="orientation|screenSize|screenLayout" atributunu əlavə etməklə edilir:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout">
</activity>
Bu halda, fəaliyyətin yenidən yaradılması yerinə, onConfigurationChanged() metodu çağrılacaq:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Konfiqurasiya dəyişməsini əl ilə idarə et
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Landşaft üçün məntiq
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Portret üçün məntiq
}
}
configChanges istifadə etmək tövsiyə edilmir, çünki bu, müxtəlif konfiqurasiya dəyişikliklərində vəziyyət və resursların idarə olunmasını çətinləşdirə bilər. Ən yaxşı yanaşma, vəziyyət məlumatlarını saxlamaq üçün ViewModel istifadə etməkdir.