Bir Activitynin Yeniden Oluşturulması
Normal
kullanım sırasında activity’nizin yok edilmesi durumu ile ilgili, kullanıcı Back
butonuna basarak geri dönmesi veya activity kendi içinde finish() metoduyla destroy işareti alması gibi
birkaç senaryo mevcuttur. Ayrıca sistem kullanıcının uygulamanızdan uzun bir
süre boyunca ayrılması durumunda veya diğer bir uygulamanın daha fazla sistem
kaynağına ihtiyaç duyması halinde arka planda kalan uygulamaların kapatılması
gerektiğinde bu işlemi kendiliğinden yapabilir.
Yukarıdaki
sebeplerden hangisi ile olursa olsun, activity örneğinin yok edilmesi sistem
tarafından Activity örneğine daha fazla ihtiyaç duyulmadığının anlaşılmasıyla
gerçekleşir. Ancak, sistem kısıtlamaları nedeniyle bir activity örneği yok
edildiğinde, gerçek activity örneği yok olsa bile kullanıcı bu uygulamaya geri
döndüğünde, bu activity yok edildiğinde son duruma ait kayıtlı verilerin de
yardımıyla sistem yeni bir örnek oluşturarak bu activityi hatırlayabilir.
Kayıtlı veri dediğim bu veriler, “instance state” dediğimiz bir önceki activity
durumunu yeniden oluşturmak için sistem tarafından kullanılır ve bu veriler Bundle
nesnesinde saklanan anahtar-değer çiftleri seti ( collection of key-value
pairs) olarak bilinir.
UYARI:
Activity’niz
kullanıcını cihazı yatay veya dikey olarak her yönlendirmesinde yok edilip
yeniden oluşturulur. Ekran yönlendirmesi her değiştiğinde, sistem her
yönlendirme için ihtiyaç duyulan farklı ara yüz kaynaklarını yüklemek için bu
işlemi gerçekleştirir.
Varsayılan olarak, Activity layout tasarımında yer alan her
bir View öğesi için sistem Bundle
kullanarak son durumları saklamaktadır. (Örneğin, EditText nesnesine girilen
text değerinin otomatik olarak saklanması). Bu sayede, ekran yönlendirmesi her
değiştiğinde hali hazırda girilmiş olunan veya mevcut durum bilgilerini
kaydetmek için ayrıca bir kod yazmanıza gerek kalmaması sağlanmış olur. Ancak,
activity’niz kaydetmek isteyebileceğiniz kullanıcının yapmış olduğu son
işlemleri takip edebilmenize yarayacak bilgiler gibi çok daha fazla durum bilgisi
içeriyor olabilir. Bunlar için SharedPreferences
konularında anlattığımız yetenekleri kullanmanız gerekecektir.
NOT:
Android sistem tarafından view öğelerinize ait durumların
yeniden yüklenmesi durumunda her bir
view android:id niteliği ile tanımlanmış benzersiz bir id’ye sahip olması
gerekir.
Activity durumu ile ilgili olarak ek veriler kaydetmek için,
onSaveInstanceState() metodunu Override
etmelisiniz. Sistem bu metodu çağırarak, kullanıcının uygulamanızı
(activitynizi) terk ettiği anda bu verileri Bundle
nesnelerine geçirir ve beklenmedik sonlanmalar meydana gelmesi ihtimaline
karşın son durumların kaydedilmesini sağlar. Eğer sistem activity örneğini daha
sonra yeniden oluşturursa, bu veriler aynı Bundle
nesnelerinden olan onRestoreInstanceState() ve
onCreate() metotlarının her ikisine de
geçirilir.
Sistem
activitynizi durduracağı zaman onSaveInstanceState()
metodunu çağırır (1). Burada activitynizin daha sonra yeniden
başlatılırken ihtiyaç duyacağı durum bilgilerini kaydedersiniz. Sistem (1) de
tanımlanan durum bilgilerini hem onCreate()
metoduna hem de onRestoreInstanceState() metoduna
geçirir.(3)
Activitynizin Durumunu Kaydetme
Activityniz
durdurulacağı zaman, sistem onSaveInstanceState() metodunu çağırır ve
activityniz son durum bilgisini anahtar-değer çiftleri setine kaydeder. Bu
metodun varsayılan uygulamasında View hiyerarşisine göre activitynin durumu
hakkındaki bilgiler kaydedilir. (Örneğin, EditText içindeki bir text değeri
veya ListView içindeki scroll konumu gibi)
Activitynize
ait fazladan durum bilgisi kaydetmek için, onSaveInstanceState() metodunu
uygulamalı ve anahtar-değer çiftlerini Bundle
nesnelerine eklemelisiniz.
ÖRNEK:
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);
}
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);
}
UYARI:
Her zaman onSaveInstanceState() metodunu
superclass olarak uygulamalısınız böylece varsayılan uygulama ile view
hiyerarşi durumunu kaydedebilirsiniz.
Activity Durumunu Yeniden Yüklemek
Daha
önce yok edilen activityniz yeniden oluşturulurken, sistem tarafından
activitynizden Bundle nesnelerine geçirilen bilgiler dahilinde kayıtlı son
durumu yeniden çağırabilirsiniz. onCreate() ve
onRestoreInstanceState() metotlarının her
ikisi de aynı Bundle kaynağından bu durum bilgilerini çeker.
Bunun
nedeni, activityniz ilk defa oluşturulurken veya daha önce yok edilen bir örnek
yeniden oluşturulurken onCreate() metodu
sistem tarafından çağırılmasıdır. Bundle nesnelerini okumaya çalışmadan evvel
mutlaka bu nesnelerin boş mu? Dolu mu? olduklarını kontrol etmeniz gerekir.
Eğer boş ise, sistem yok edilmiş bir örnek oluşturmak yerine activitynin yeni
bir örneğini oluşturur.
onCreate() metoduyla bazı
durum verilerini nasıl yeniden yüklendiğini inceleyelim.
ÖRNEK:
@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() metodu yerine
sistem tarafından onStart () metodunun hemen
ardından çağırılacak olan onRestoreInstanceState() metoduyla
yeniden yükleme işlemi yapmak isterseniz, Bundle
nesnelerini kontrol etmenize gerek kalmaz.
ÖRNEK:
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); }
UYARI:
Her zaman onRestoreInstanceState()
metodunu superclass olarak uygulamalısınız böylece varsayılan uygulama
ile view hiyerarşi durumunu kolaylıkla yeniden oluşturabilirsiniz.