Sobes.tech
Junior

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ü:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Sistem yeni bir aktivite örneği oluşturur.
  5. onCreate()
  6. onStart()
  7. onResume()

Aktivitenin yok edilmeden önce durum verilerini kaydetmek için kullanılır:

  • onSaveInstanceState(): küçük verileri bir Bundle içinde kaydeder.

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("myKey", "myValue") // Veri kaydet
    }
    

    onCreate() veya onRestoreInstanceState() 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.