OnCreate (Paket kaydedildiInstanceState)


Yanıtlar:


106

Uygulamanın durumunu bir pakette kaydederseniz (tipik olarak kalıcı olmayan, dinamik veriler onSaveInstanceState), onCreateetkinliğin yeniden oluşturulması gerekiyorsa (örn. Yön değişikliği) geri aktarılabilir , böylece daha önce bunu kaybetmezsiniz bilgi. Hiçbir veri sağlanmadıysa, savedInstanceStateboştur.

... kalıcı verileri (kullanıcı düzenlemeleri gibi) depolamaya yazmak için onPause () yöntemini kullanmalısınız. Buna ek olarak, onSaveInstanceState (Bundle) yöntemi, etkinliği bu tür bir arka plan durumuna yerleştirmeden önce çağrılır ve etkinliğinizdeki herhangi bir dinamik örnek durumunu belirli bir Pakete kaydetmenize olanak tanır ve etkinlik daha sonra onCreate (Bundle) içinde alınır. yeniden oluşturulması gerekiyor. Bir sürecin yaşam döngüsünün barındırdığı faaliyetlere nasıl bağlı olduğu hakkında daha fazla bilgi için Süreç Yaşam Döngüsü bölümüne bakın. Kalıcı verileri onSaveInstanceState (Bundle) yerine onPause () 'a kaydetmenin önemli olduğunu unutmayın çünkü ikincisi yaşam döngüsü geri aramalarının bir parçası değildir, bu nedenle belgelerinde açıklandığı gibi her durumda çağrılmayacaktır.

kaynak


2
Diğer aktiviteler aynı Paketi paylaşıyor mu? Başka bir aktiviteye başlarsam, Bundle'ı ilkinden geçer mi?
Francisco Corrales Morales

17

onCreate(Bundle savedInstanceState)Eğer alacak Bundleetkinlik olsun ilk başlatıldığında null adlı ve faaliyet yönelimi değişti ne zaman kullanıma geçecektir .......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android, bunu başarmanın başka bir zarif yolunu sunar. Bunu başarmak için adı verilen bir yöntemi geçersiz kılmalıyız onSaveInstanceState(). Android platformu, kullanıcıların herhangi bir örnek durumunu kaydetmesine olanak tanır. Örnek durumu Pakete kaydedilebilir. Bundle, onSaveInstanceState yöntemine bağımsız değişken olarak aktarılır.

onCreatemetoda argüman olarak aktarılan Bundle'dan kaydedilmiş örnek durumunu yükleyebiliriz . Ayrıca kaydedilmiş örnek durumunu onRestoreInstanceStatemetoda da yükleyebiliriz . Ama bunu okuyucuların çözmesi için bırakacağım.


11
savedInstanceStateönceden çağrılmışsa olmayan nullolacaktır onSavedInstanceState(). yönelim değişiklikleri, bunun meydana gelebileceği yalnızca bir örnektir.
Alex Lockwood

1
@AlexLockwood, bunun meydana gelebileceği tüm durumları düşünmeye çalışıyorum. Herhangi bir belge var mı? Aklıma gelen bir örnek, kullanıcının uygulamaları değiştirip geri gelip gelmediği, ancak kaynakları kurtarmak için etkinlik yok edildi. Bu durumda android, onSaveInsanceState () geçersiz kılındıysa etkinliği bir paketle yeniden oluşturacaktır, değil mi?
batbrat

1
@batbrat Evet ... Yaptığım yorum (neredeyse iki yıl önce) tamamen doğru değil. Ne olduğunu koymak için en iyi yolu tahmin Bundleetmek argüman onCreate(Bundle)olmayan olacaktır nullancak ve ancak Activity's vardı onSaveInstanceStateyöntemi daha önce aradı. Bu, oryantasyon değişiklikleri sırasında olur ... ve aynı zamanda, işletim sistemi tarafından öldürüldükten sonra etkinlik geri geldiğinde ve cihazınızda ilgili başka herhangi bir yapılandırma değişikliğini tetiklediğinizde de olur.
Alex Lockwood

Açıklama için teşekkürler Alex. Konuyla ilgili biraz netlik olması güzel. Özellikle yönlendirme anahtarları dışındaki yapılandırma değişikliklerini unutmuştum.
batbrat

15

Dhruv Gairola'nın yanıtladığı gibi, Bundle SavedInstanceState'i kullanarak uygulamanın durumunu kaydedebilirsiniz. Benim gibi yeni öğrencilerin kolayca anlayabileceği çok basit bir örnek vermeye çalışıyorum.

Diyelim ki, bir TextView ve bir Button içeren basit bir parçanız var. Düğmeye her tıkladığınızda metin değişir. Şimdi, cihazınızın / emülatörünüzün yönünü değiştirin ve verileri kaybettiğinizi (aldığınız tıkladıktan sonra değiştirilen veriler anlamına gelir) ve parçanın ilk kez tekrar başladığını fark edin. Bundle SavedInstanceState kullanarak bundan kurtulabiliriz. Parçanın yaşam döngüsüne bir göz atarsanız. Fragment Lifecylce , fragman yok edilmek üzereyken "onSaveInstanceState" yönteminin çağrıldığını göreceksiniz.

Yani, durumu kaydedebiliriz, değiştirilen metin değeri şu şekilde bu pakete

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

Yönlendirmeyi yaptıktan sonra "onCreate" yöntemi çağrılacak değil mi? yani bunu yapabiliriz

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

Şimdi, oryantasyondan sonra değerinizi kaybetmeyeceksiniz. Değiştirilen değer her zaman görüntülenecektir.


Bunun Activity için de geçerli olduğuna dikkat edin. (Bundle of Activity) ve Bundle of Fragment arasındaki fark hakkında daha fazla açıklama yapabilir misiniz?
laalaguer

Bir aktivitenin bir seferde birden fazla bölüm gösterebileceği yaşam döngülerinden ve parçadan net bir anlayış elde edebilirsiniz. Yani, temel fark, bir faaliyetin tüm parçaları için bazı değerleri kaydetmek isteyebilmenizdir, o zaman etkinlik demetini kullanın, aksi takdirde u belirli bir parça içinse parça demetini kullanmalısınız.
Esad

5

Android'de onCreate (Bundle registeredInstanceState) İşlevi:

1) Bir Etkinlik ilk kez çağrıldığında veya başlatıldığında, etkinliği oluşturmaktan onCreate (Paket kaydedildiInstanceState) yöntemi sorumludur.

2) Aktivitenin yönü (yani yataydan dikeye veya dikeyden yataya) değiştiğinde veya bir Aktivite herhangi bir İşletim Sistemi tarafından zorla sonlandırıldığında, o zaman kaydedilen InstanceState, yani Paket Sınıfı nesnesi bir Aktivitenin durumunu kaydedecektir.

3) Oryantasyon değiştirildikten sonra onCreate (Bundle SavedInstanceState), etkinliği çağırıp yeniden oluşturacak ve SavedInstanceState'ten tüm verileri yükleyecektir.

4) Temelde Bundle sınıfı, uygulamada yukarıdaki durum meydana geldiğinde etkinlik verilerini depolamak için kullanılır.

5) onCreate () uygulamalar için gerekli değildir. Ancak uygulamada kullanılmasının nedeni, bu yöntemin başlatma kodunu koymak için en iyi yer olmasıdır.

6) Ayrıca başlatma kodunuzu onStart () veya onResume () içine de koyabilirsiniz ve uygulamanız ilk yüklendiğinde onCreate () ile aynı şekilde çalışacaktır.


4

onCreate(Bundle)etkinlik ilk başladığında çağrılır. Bunu, kullanıcı arabirimi oluşturmak gibi tek seferlik başlatma gerçekleştirmek için kullanabilirsiniz. onCreate()ya boş olan bir parametreyi ya da önceden onSaveInstanceState.


0

onCreate (Bundle SavedInstanceState) çağrılır ve kaydedildiInstanceState, Activity'iniz ve yukarıda açıklanan bir senaryoda (görsel görünüm) sonlandırılmışsa boş olmayacaktır. Uygulamanız daha sonra SavedInstanceState'ten verileri alabilir (yakalayabilir) ve Aktivitenizi yeniden oluşturabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.