Translate

17 Temmuz 2013 Çarşamba

Recreating an Activity - Bir Activity'yi Yeniden oluşturma

Kullanıcının geri tuşuna basması veya activity'nin finish() metodunu çağırması ile kendi kendini sonlandırması gibi bir activity'nin yok edilmesi ile ilgili birkaç senaryo vardır. Aynı zamanda activity sistemin uzun süre kullanılmamasından ve bellek gibi sistem kaynaklarının serbest bırakılmasını sağlamak için veya sistemin durdurulmuş olmasından da yok edilebilir.
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.

Resim 2. Sistem activity'yi durdurmaya başladığı sırada, onSaveInstandeState() metodunu çağırır, böylece Activity'nin tekrar oluşrurulması sırasında kaydedilmesi istenilen ek durum verileri belirlenebilir.  Eğer activity yokedilmişse ve aynı instansın yeniden oluşturulması gerekiyorsa, sistem (1) de belirlenen  veri durumunu hem onCreate() metoduna (2) hemde onRestoreInstanceState() metoduna(3) 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