Activity Sınıfı

Activity Sınıfı

Activity sınıfı tarafından oluşturulan nesneler uygulama içinde kullanılan ekranları temsil ederler. Uygulamanızdaki her Activity'yi AndroidManifest.xml'de tanımlamalısınız. Eğer yeni Activity, AndroidManifest dosyasında tanımlı değilse uygulamamız çökecektir.
Her uygulamanın LAUNCHER olarak tanımlı bir Activity sınıfı olmalıdır. Bu şekilde tanımlanmış bir Activity, uygulama ilk açıldığında otomatik olarak harekete geçer ve kullanıcının karşısına çıkan ilk ekran olur.
Activity dosyaları ilk çalıştıklarında onCreate metodu devreye girer. Bu metotta genel olarak setContentView metodu çalıştırılarak bir layout dosyasından ekran tasarımı yüklenir. Eğer ekran ilk oluştuğunda tanımlanması gereken başka değişkenler ve aksiyonlar varsa, onlar da onCreate metodu içinde gerçekleştirilebilirler.
@Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new LoadDatabaseTask().execute((Void) null);
    }
onCreate dışında bir Activity'nin yaşam döngüsü içerisinde başka metotlar da harekete geçirilir. Bu metotları sıralarsak;
  • onCreate: Activity ilk oluşturulduğunda çağırılır. Activity herhangi bir nedenden ötürü yok edilmezse (bellek ihtiyacı ya da finish metodu) bir daha çalıştırılmaz.
  • onStart: onCreate metodu çalıştırılıp görsel öğeler oluştuktan sonra çağırılır.
  • onResume: Activity herhangi bir sebepten dolayı durdurulduysa (başka bir ekrana geçiş) tekrar ekrana geldiğinde bu metot harekete geçer. Activity çalıştırılmadan önce harekete geçen son metottur. Bu metottan sonra belirlenen koda göre Activity yaşamına başlar.
  • onPause: Activity bir sebepten dolayı arka plana atılırsa harekete geçer. Bu Back tuşuna basılmasından ya da sistemin bellek ihtiyacından kaynaklanabilir. Bu metot içerisinde anlık bilgilerin kaydedilmesi önerilir. onPause işlemi hızlı çalışmak zorundadır, çünkü buradaki işlem bitmeden bir sonraki Activity harekete geçmez.
  • onStop: Activity arka plana atıldığı anda işleme girer. Bu noktada iki seçenek vardır; ya kullanıcı yeni ekrandaki işini bitirip geri gelir ya da Activity tamamen kapatılır. Kullanıcı geri geldiği takdirde onRestart metoduna geçilir ve döngü onStart metodundan tekrar başlar. Eğer kullanıcı geri gelmeyecekse onDestroy metodu çalıştırılır.
  • onDestroy: Activity'e ait bütün kaynaklar yok edilir. Activity bu noktada yaşam döngüsünü tamamlamıştır.

Yukarıdaki metotlar bir Activity'nin yaşamını kontrol etmemize yardımcı olur. Özellikle kullanıcı bir ayarı kaydediyorsa ya da oyun oynuyorsa ve bu sırada bir telefon konuşması başlayacaksa anlık durumları kaydetmemiz için bu metotların çalışma esaslarını bilmeliyiz.
Herhangi bir ekranın Activity sınıfı tarafından oluşturulması yeterlidir. Ancak bunun yanında Android işletim sistemi, sık kullanılan ekranlara özel Activity sınıfları sağlar. Bunlara göz atarsak;
  • ListActivity: Bir veritabanındaki veriyi listelemek ya da sunucudan gelen veriyi kullanıcıya göstermek, uygulamalarda sık rastlanan işlemlerdir. Bunun için Android işletim sistemi bize ListActivity sınıfını sunar. Standart bir layout dosyasından oluşturulan bu ekran sayesinde elimizdeki veriyi rahat bir şekilde görüntüleyebiliriz.
  • MapActivity: Harita uygulamaları için sık kullanılan bir Activity tipidir. Google Maps haritaları üzerinde işlem yapacağımız bir uygulamamız varsa bu Activity bize yardımcı olacaktır.
  • PreferenceActivity: Android işletim sistemine benzer bir kullanıcı ayar menüsü yapmayı hedefliyorsak, PreferenceActivity'den faydalanabiliriz. PreferenceActivity layout dosyasında vereceğimiz yapıya göre sunulan seçenekleri alt kategorilerle ekrana getirir. Aynı zamanda kullanıcının saklayacağı değerleri, her değere özel bir anahtar atayarak (key – value) bellekte otomatik olarak saklar.
İlerleyen bölümlerde yer alan örneklerde, bu Activity'leri kullanarak uygulamaların ekranları oluşturucağız.

Bir Activity'i Yeniden Yaratma

​Uygulamada çeşitli yollarla (kullanıcının geri tuşuna basması, Activity'nin finish() metodunu çagırması gibi) Activity'nin sonlanması ya da İngilizce tabiriyle "destroy" olması, gayet doğal bir işlemdir. Sistemin daha fazla belleğe ihtiyacı olduğunda ya da Activity çok uzun süredir çalıştığı için durdurulabilir. Bu eğitim belgesinde sonlanan bir Activity'nin yeniden nasıl başlatılacağını anlatacağız.

Activity, kullanıcının geri tuşuna basması ya da kendini sonlandırması (finish()) durumlarında tamamıyla kaybolur çünkü sistem Activity'nin artık gerekli olmadığını farzeder. Activity sistem tarafından sonlandırıldıysa Activity'de bulunan verileri saklayıp, kullanıcı geri dönmek istediğinde yeniden Activity oluşturarak bu verileri ona yükler. Activity'nin hangi adımda olduğunu sakladığı için yine o duruma gelerek kullanıcının kaldığı son ekranı gösterir. Sistem tarafından korunan veriler Bundle objesinde anahtar-değer çiftleriyle tutulur.

Normalde sistem Bundle kullanarak uygulamanın Activity layout'unda bulunan tüm view nesnelerini saklar (editext'e girilen değer gibi). Eğer Activity'niz sonlanır ve yeniden başlatılırsa layout dosyasındaki nesnelerin son değerleri korunur. Sizin kodunuzu gerektirmeyen bu özellikle birlikte kullanıcı deneyiminin artırılması ve uygulamanın daha verimli çalışması için daha fazla veri ve durumun kazanılması gerekebilir, bunun için Activity'nin ilerleyişini çeşitli değişkenlerle saklamanız gerekmektedir.

Android sisteminin son durum değerlerini kurtarabilmesi için tüm View'lar android:id niteliğinden sağlanan benzersiz (unique) ID'ye sahip olmak zorundadır.

Activity durumları için daha fazla veri kaydetmek isterseniz,onSaveInstanceState() callback methodunu ezmeniz (override) gerekmektedir. Sistem, kullanıcı Activity'den çıktığında metodun sakladığı verileri Bundle nesnesine yükleyerek, sistem Activity'yi yeniden oluşturmak durumunda kalırsa onRestoreInstanceState() veya onCreate() metodunu çağırdığında aynı Bundle nesnesini kullanır.

Activity State'inin kaydedilmesi

Uygulamanızın Activity'si durmaya başladığında, sistem tarafından onSaveInstanceState() metodu çağrılır, bu yolla uygulamanızın Activity state'ini anahtar-değer çiftleriyle kaydebilirsiniz. Metodun olağan gerçeklemesinde (default implementation) Activity'nin durumunu View hiyerarşisine göre kaydedilir. Örneğin EditText içerisindeki bir değer ya da ListView öğesi içinde ekranın kaydırılma miktarının kaydedilmesi gibi.
Eğer Activity'nin daha fazla durum bilgilerini kaydetmek istiyorsanız, onSaveInstanceState() metoduna yeni kod eklemeleri yaparak Bundle nesnesine anahtar-değer çifti belirtmek durumundasınız. Kod örneğimizle konu daha iyi anlaşılacaktır:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // kullanıcının o anki durumunu kaydediyoruz
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
    
    // Her zaman superclass'ı çağırarak methodun temel işlevini de yerine getirmesini sağlıyoruz
    super.onSaveInstanceState(savedInstanceState);
}
Dikkat: Her zaman onSaveInstanceState()'in superclass'ını çağırmalısınız ki, metodun varsayılan gerçeklemesi View hiyerarşisinin durumunu da kaydedebilsin.

Activity State'ini yeniden yüklemek

Activity'niz yeniden yaratıldığında, yok edilmeden önceki Bundle nesnesine kaydedilmiş durum bilgilerini yükleyebilirsiniz. onCreate() ve onRestoreInstanceState() metodları çağrıldığında Bundle nesnesinin üzerinden geçerek durum bilgisini yeniden yüklerler.
Sistem tarafından Activity'nizin yeni bir instance'ı (sınıf örneği) oluştururulduğunda ya da sistem önceki Activity'yi yeniden yarattığında onCreate() metodu çalışacaktır. onCreate() metodu çağrıldığında Bundle nesnesinin null (boş) olup olmadığını kontrol etmelisiniz. Eğer null ise sistem yeni bir Activity oluşturur. Eğer Bundle null değilse eski Activity'nin değerlerini yükleyecektir.
Örneğimizle bir Activity'nin Bundle nesnesi boş değilse eski değerleri nasıl yüklediğimizi görelim:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // her zaman öncelikle superclass'ı çağırıyoruz
   
    // önceden yok edilen instance'i yaratıp yaratmadığımızı kontrol edelim

    if (savedInstanceState != null) {

        // kaydedilen eski activity değerlerini yüklüyoruz.
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // yeni bir activity yaratıyoruz
    }
    ...
}
onCreate metoduyla bilgileri yeniden yüklemek yerine onRestoreInstanceState() metoduyla durum bilgilerini getirebilirsiniz. Sistem onStart metodu sonrası otomatik olarak bu metodu çağırdığı için Bundle'ın null olup olmadığını kontrol etmek zorunda kalmazsınız. Örneğimizle bu metodu nasıl kullanıldığını görebilirsiniz:
 public void onRestoreInstanceState(Bundle savedInstanceState) {

// view hiyerarşinin korunması için her zaman öncelikle superclass'ı çağırıyoruz.

super.onRestoreInstanceState(savedInstanceState);

// kaydedilen durumların yeniden yüklenmesi

mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

}
Dikkat: onRestoreInstanceState() metodunda view hiyerarşinin korunması için her zaman öncelikle superclass'ı çağırıyoruz.



Yorumlar

Bu blogdaki popüler yayınlar

İç İçe Döngüler

CSS Bir Elemanın Genişliği ve Yüksekliği

JavaScript Dilinde Fonksiyon Çağırma Teknikleri