Activity kullanıcının geri butonuna basması sonucu activity'nin kendini bitirmesi ile yokedildiğinde, sistemin bu durumdan anladığı bu activity'ye artık ihtiyaç olmadığı ve Activity'ye ait instansın ebediyen ortadan kaldırılacağıdır. Ancak, sistem sınırlaması yüzünden eğer activity sistem tarafından yok edilirse (normal uygulama davranışından daha fazlası), daha sonra asıl Activity instansının gitmiş olmasına rağmen, sistem tekrardan geri tuşuna basıldığında varolan durumu hatırlar, sistem activity'nin yokedildiği durumda kaydedilmiş verileri kullanarak yeni bir Activity instansı oluşturur. Önceki duruma dönmek için depolanmış veri "instans durumu (instance state)" olarak adlandırılır ve key-value çiftlerini tutan bir Bundle nesnesinden oluşur.
Dikkat: Kullanıcı ekranın yönünü her değiştirdiğinde Activity yok edilip yeniden oluşturulur. Ekran yönünü değiştirdiğinde, sistem öndeki activity'yi yok eder, çünkü ekran konfigürasyonu değişmiştir ve activity alternatif kaynakları yüklemelidir (layout gibi).
Varsayılan olarak, sistem activity layout'undaki her View nesnesi hakkındaki bilgileri kaydetmek için Bundle instans durumunu kullanır.(Bir EditText nesnesine girilmiş bir metin gibi). Böylece eğer activity'niz yokedilir ve tekrar oluşturulursa herhangi bir kod eklemeden önceki durumuna getirilebilir. Ancak, activity geri getirilmesini istediğiniz kullanıcının activity içindeki işlemlerini izleyen üye bilgisi gibi daha fazla durum bilgisine sahip olabilir.
Not: Android sistemin activity'deki view'leri geri getirebilmesi için, her view'in benzersiz bir id'ye sahip olması gereklidir. Bu android:id özelliği ile sağlanır.
Activity durumu ile ilgili ek veri kaydetmek için, onSaveInstanceState() callback metodunu yeniden yazmalısınız (yani override etmelisiniz). Sistem bu metodu kullanıcı activity'yi terk ettiğinde çağırır ve activity beklenmedik şekilde yokedildiği durumda kaydedilen Bundle nesnesine geçer. Eğer activity instansını daha sonra yeniden oluşturmak isterseniz, sistem Bundle nesnesini hem onRestoreInstanceState() metoduna hem de onCreate() metoduna birlikte geçer.
Save Your Activity State - Activity Durumunu Kaydetme
Activity durmaya başladığında, sistem onSaveInstanceState() metodunu çağırır, böylece activity key-value çiftleri ile birlikte durum bilgisini kaydedebilir. Bu metodun varsayılan şekli activity'nin view hiyerarşisi hakkındaki EditText içindeki metin veya LastView'in scroll pozisyonu gibi bilgileri kaydeder.
Activity için ek durum bilgileri kaydedilmek istendiğinde, onSaveInstanceState() metodu implement edilmeli ve bir Bundle nesnesine key-value çiftler eklenmeli. Örneğin:
static final String STATE_SCORE = "playerScore"; static final String STATE_LEVEL = "playerLevel"; ... @Override public void onSaveInstanceState(Bundle savedInstanceState) { // Save the user's current game state savedInstanceState.putInt(STATE_SCORE, mCurrentScore); savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); }
Dikkat: Her zaman onSaveInstanceState() metodunun superclass implemantasyonunu çağırın, böylece varsayılan implementasyon view hiyerarşi durumunun kaydedebilir.
Restore Your Activity State - Activity Durumunu Geri Getirme
Daha önceden yokedilmiş bir activity tekrar oluşturulduğunda, Activity sistem tarafından geçen bir Bundle nesnesi tarafından yeniden şekillendirilir. onCreate() ve onRestoreInstanceState() metodlarının her ikisi de o anki durum bilgisini içeren aynı Bundle nesnesini alır.
onCreate() metodu sistemin yeni bir activity'ye ait yeni bir instans mı yoksa önceki bir activity instansını tekrardan oluşturduğu bilinmeden çağrılır. Bundle durumunun onu okumadan önce null olup olmadığı kontrol edilmelidir. Eğer null ise, önceki durumu getirmek yerine sistem activity'nin yeni bir örneğini oluşturmalıdır.
Örneğin, aşağıda bazı durum verilerinin onCreate() metodunda nasıl geri getirileceği görülüyor.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Always call the superclass first // Check whether we're recreating a previously destroyed instance if (savedInstanceState != null) { // Restore value of members from saved state mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); } else { // Probably initialize members with default values for a new instance } ... }
onCreate() esnasında durumu geri getirmek yerine onStart() metodundan sonra sistem tarafından çağrılan onRestoreInstanceState() metodunu imlement etme de seçilebilir. Sistem sadece kaydedilmiş bir durumu geriçağırmak için onRestoreInstanceState() metodunu çağırır, bu yüzden Bundle'ın null olup olmadığının kontrol edilmesine gerek kalmaz.
public void onRestoreInstanceState(Bundle savedInstanceState) { // Always call the superclass so it can restore the view hierarchy super.onRestoreInstanceState(savedInstanceState); // Restore state members from saved instance mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); }
Dikkat: Her zaman onRestoreInstanceState() metoduna ait superclass implemantasyonu yapılmalıdır. Böylece varsayılan implemantasyon view hiyerarşisinin durumunu geri getirebilir.
Hiç yorum yok:
Yorum Gönder