OnSaveInstanceState () ve onRestoreInstanceState () tam olarak ne zaman çağrılır?


102

Aşağıdaki şekil ( resmi belgeden ) bir Android etkinliğinin iyi bilinen yaşam döngüsünü açıklamaktadır :

görüntü açıklamasını buraya girin

(Hafıza ihtiyaçları ıslah edilmesi için örneğin) aktivitesi sistemi ile yok edilir, diğer taraftan, etkinlik durumu bazen otomatik bir kaydedilebilir ve geri yöntemler vasıtasıyla onSaveInstanceState()ve onRestoreInstanceState()aynı zamanda (aşağıda şekil ile gösterildiği gibi, dan resmi doc ):

görüntü açıklamasını buraya girin

Ben farkındayım onSaveInstanceState()edilir hep aramadı bir etkinlik yok edilmek üzereyken. Örneğin, kullanıcı "geri" düğmesine bastığı için yok edilirse, etkinlik durumu korunmaz. Ancak devlet durumlarda olduğu kaydedilir ve restore ve onSaveInstanceState()/ onRestoreInstanceState()çağrılırız, tam olarak ne zaman onlar denir ?

Örneğin, yukarıda belirtilen verilere göre, onRestoreInstanceState()daha önce olarak adlandırılabilir onStart()ya da sonrasında onStart()ama daha önce onResume()ya da sonra onResume(). Benzer şekilde, çeşitli olasılıklar mevcuttur onSaveInstanceState(). Peki tam olarak ne zaman aranıyorlar?

İdeal olarak, aktivite yaşam döngüsü durumlarını ve varsa kaydetme / geri yükleme yöntemlerini gösteren birleşik bir diyagram görmek isterim .


son cevabı onPause () ve onStop () arasında çağrılan onSaveInstanceState () adlı Android resmi belgesinden aldı.
Rishi

1
@Rishi Bu belgeye bir bağlantı verebilir misiniz?
Luis Mendo



haklı olup olmadığımı lütfen açıklayın
Rishi

Yanıtlar:


107

Başına belgeler :

void onRestoreInstanceState (Bundle SavedInstanceState)

Bu yönteme onStart()ve arasında denir onPostCreate(Bundle).

void onSaveInstanceState (Bundle outState)

Çağrılırsa, Build.VERSION_CODES.P ile başlayan platformları hedefleyen uygulamalar için bu yöntem onStop () sonrasında ortaya çıkar. Daha önceki platform sürümlerini hedefleyen uygulamalar için bu yöntem onStop () 'dan önce gerçekleşir ve onPause ()' dan önce mi yoksa sonra mı oluşacağına dair hiçbir garanti yoktur.


1
Teşekkürler. Lütfen dokümantasyonun bağlantılarını verebilir misiniz?
Luis Mendo

İşte gidiyorsunuz, ayrıca onStart () ve onPostCreate () arasında başka bir şey olduğunu düşünmüyorum, bu yüzden onRestoreInstanceState () zincirde iyi tanımlanmıştır.
Steve M

Çok teşekkürler. Bu sorunu açıklığa kavuşturuyor
Luis Mendo

1
@SteveM "OnPause () 'dan önce mi sonra mı olacağına dair hiçbir garanti yok" Bu, bir görünüme erişmeye çalışırsak (bir liste görünümünden bir dizin gibi kaydetmek için bir değer elde etmek için) NullPointerExceptions ile karşılaşabileceğimiz anlamına mı geliyor?
Tiago

3
Daha sonra, bir veri yapısını onPause'a kaydetmek ve onSaveInstanceState ve onRestoreInstanceState yerine onResume'a geri yüklemek için ne önerilir?
Gödel77

19

Gereğince doc1 ve doc2

onSaveInstanceState

Honeycomb'dan önce, etkinlikler duraklatılana kadar öldürülebilir sayılmazdı, yani onSaveInstanceState () onPause () işleminden hemen önce çağrılırdı. Ancak Honeycomb ile başlayarak, Aktiviteler yalnızca durdurulduktan sonra öldürülebilir olarak kabul edilir, yani onSaveInstanceState () artık onPause () 'dan hemen önce değil onStop ()' dan önce çağrılacaktır.

onRestoreInstanceState

Bu yöntem, etkinlik önceden kaydedilmiş bir durumdan yeniden başlatılırken onStart () ve onPostCreate (Bundle) arasında çağrılır.


Farklı Android sürümleri üzerindeki senaryoları açıklama
şeklinizi beğendim

14

Halihazırda yayınlanan cevaplara ek olarak, Android P'de ortaya çıkan ince bir değişiklik var:

void onSaveInstanceState (Bundle outState)

Çağrılırsa, bu yöntem P ile başlayan platformları hedefleyen uygulamalar için SONRA gerçekleşir . Önceki platform sürümlerini hedefleyen uygulamalar için bu yöntem daha önce gerçekleşir ve öncesinde mi yoksa sonra mı oluşacağına dair hiçbir garanti yoktur .onStop()onStop()onPause()

Kaynak: dokümanlar

Bu değişikliğin neden tanıtıldığına gelince, işte cevap:

... böylece bir uygulama içinde parça işlemlerini güvenle gerçekleştirebilir onStop()ve kalıcı durumu daha sonra kaydedebilir.

Kaynak: dokümanlar


Merhaba, harika yorum. P'yi hedefleyen ancak daha düşük api'de çalışan uygulamanın nasıl davranacağını biliyor musunuz? Daha düşük api hedefleyen uygulama ile aynı mı yoksa api genelinde tutarlı olacak ve "api hedefleme" davranışını koruyacak mı?
Filipkowicz

@Filipkowicz, Do you know how will behave app that target P but runs on lower api?Uygulama M'de çalıştırıldığı sürece, bu cihazın sahip olduğu Android sürümü P'de sunulan değişiklikleri içermiyor, bu da hedefi belirlediğinizden bağımsız olarak Pgöremeyeceğiniz anlamına geliyor P öncesi cihazlar için farklı. Umarım bu, sorunuzu yanıtlar.
azizbekian

Bugün bu cevabı okuduktan sonra kendimi çok rahatlamış hissediyorum, çünkü Udacity'de android ücretsiz kursunu yapıyordum ve hala ders 5 egzersiz 8'de onStop ve onDestroy yöntemlerinin orada olmaması gerektiğini belirten eğitimlerin eski sürümlerine sahipler. görüntülenen textView. Ancak bunun android'in eski sürümleri için olduğunu bilmiyordum ve uygulamamı android pasta üzerinde çalıştırıyordum ve textView'umda onStop yöntemini alıyordum. Çok teşekkür ederim. Nihayet iyi hissediyorum.
Sandhu

6

Bu, onSaveInstanceState (Bundle) için ek bir bilgidir

belgelerden

Bu yöntemi, bir etkinlik arka plana yerleştirildiğinde veya yok olma yolunda her zaman çağrılan onPause () veya yok edilmeden önce çağrılan onStop () gibi etkinlik yaşam döngüsü geri aramalarıyla karıştırmayın. OnPause () ve onStop () 'un çağrıldığı ve bu yöntemin olmadığı bir örnek, bir kullanıcının B aktivitesinden A aktivitesine geri dönmesidir: B üzerinde onSaveInstanceState (Bundle)' ı çağırmaya gerek yoktur çünkü bu belirli örnek asla geri yüklenmeyecektir , bu nedenle sistem onu ​​çağırmaktan kaçınır. OnPause () çağrıldığında ve onSaveInstanceState (Bundle) olmadığında bir örnek, B aktivitesinin A aktivitesinin önünde başlatılmasıdır: sistem, B'nin ömrü boyunca öldürülmemişse, A aktivitesi üzerinde onSaveInstanceState (Bundle) 'ı çağırmaktan kaçınabilir. A'nın kullanıcı arayüzünün durumu bozulmadan kalacaktır.

Yani bu varsayılan uygulama ...

Varsayılan uygulama, hiyerarşide bir kimliği olan her görünümde onSaveInstanceState () çağırarak ve şu anda odaklanılan görünümün kimliğini kaydederek (tümü tarafından geri yüklenir) sizin için örnek başına kullanıcı arabiriminin çoğunu halleder. onRestoreInstanceState (Bundle) varsayılan uygulaması). Her bir görünüm tarafından yakalanmayan ek bilgileri kaydetmek için bu yöntemi geçersiz kılarsanız, büyük olasılıkla varsayılan uygulamaya geçmek isteyeceksiniz, aksi takdirde her görünümün tüm durumunu kendiniz kaydetmeye hazır olun.


0
String activityState;
@Override 
public void onCreate(Bundle savedInstanceState) {
// call the super class onCreate to complete the creation of activity like 
// the view hierarchy 
super.onCreate(savedInstanceState);

// recovering the instance state 
if (savedInstanceState != null) {
     activityState = savedInstanceState.getString(STATE_KEY);
 } 

   setContentView(R.layout.main_activity);
   mTextView = (TextView) findViewById(R.id.text_view);
} 

// Bu geri çağrı, yalnızca daha önce // onSaveInstanceState () kullanılarak kaydedilmiş kaydedilmiş bir örnek olduğunda çağrılır. OnCreate () 'deki bazı durumları isteğe bağlı olarak geri yükleyebiliriz //, muhtemelen onStart () tamamlandıktan sonra kullanılabilir. // KaydedilenInstanceState Paketi, onCreate () içinde kullanılanla aynıdır.

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) {
 mTextView.setText(savedInstanceState.getString(STATE_KEY));
  } 


// invoked when the activity may be temporarily destroyed, save the instance 
//state here 
//this method will be called before onstop

@Override 
 public void onSaveInstanceState(Bundle outState) {
    outState.putString(STATE_KEY, activityState);

    // call superclass to save any view hierarchy 
    super.onSaveInstanceState(outState);
} 

Affedersiniz, bu , kaydetme / geri yükleme yöntemleri tam olarak ne zaman çağrılırsa soruyu nasıl yanıtlıyor ?
Luis Mendo
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.