Ekran döndürülürken neden etkinlik yeniden oluşturulur?
sobes.tech yapay zeka
AI'dan gelen yanıt
Ekran döndürüldüğünde, cihazın yapılandırması değişir, örneğin yönlendirme. Android buna tepki olarak, gerekli değişiklikleri uygulamak için aktiviteyi yok eder ve yeniden oluşturur; bu, portre veya manzara yönüne özgü layout dosyaları gibi kaynaklarda yapılır.
Döndürme sırasında aktivitenin yaşam döngüsü:
onPause()onStop()onDestroy()- Sistem yeni bir aktivite örneği oluşturur.
onCreate()onStart()onResume()
Aktivitenin yok edilmeden önce durum verilerini kaydetmek için kullanılır:
-
onSaveInstanceState(): küçük verileri birBundleiçinde kaydeder.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Veri kaydet }onCreate()veyaonRestoreInstanceState()içinde geri yükleme:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... if (savedInstanceState != null) { val myValue = savedInstanceState.getString("myKey") // Veriyi geri yükle } // ... } -
ViewModel: UI denetleyicisinin (Activity/Fragment) yaşam döngüsü boyunca, yapılandırma değişse bile, verileri saklar. ViewModel, aktivitenin yok olmasını atlatır ve durumunu kaybetmez.
class MyViewModel : ViewModel() { var counter = 0 }Aktivite/fragmentte kullanımı:
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Artık viewModel.counter, döndürme sırasında korunur } } -
Daha kalıcı veriler için SharedPreferences veya veritabanında veri kaydetme.
Ekran döndürme sırasında aktivitenin yeniden oluşturulmasını önlemek için, yapılandırma değişikliklerini kendisinin yöneteceğini belirtebilirsiniz. Bu, manifestte <activity> etiketi içine configChanges="orientation|screenSize|screenLayout" özniteliği eklenerek yapılır:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout">
</activity>
Bu durumda, aktivite yeniden oluşturulmak yerine, onConfigurationChanged() metodu çağrılır:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Yapılandırma değişikliğini manuel olarak yönet
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Yatay yönlendirme için mantık
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Dikey yönlendirme için mantık
}
}
configChanges kullanımı çoğu durumda önerilmez, çünkü farklı yapılandırma değişikliklerinde durum ve kaynakların yönetimini zorlaştırabilir. Tercih edilen yöntem, durum verilerini saklamak için ViewModel kullanmaktır.