Android : Aktivitenin Yaşam Öyküsü

   Xamarin.Android makale serisinde geriye dönüp baktığımızda pek çok önemli konuya değindiğimizi görebiliriz. Her makalede bilgi birikimimize bir taş daha eklerken, sıra geldi Xamarin.Android ile geliştirdiğimiz bir uygulamanın yaşam hikayesini incelemeye. Aslına bakarsanız burada paylaşacaklarımın bir çok Xamarin’e özgü olmaktan öte Android uygulamalarının tamamında geçerli konseptlerdir.

   Makalemin henüz çok başlarında iken hemen belirteyim; Windows 8 ile uygulama geliştirdiyseniz, bu konudaki “Metro Stil Bir Uygulamanın Yaşam Hikayesi” başlıklı makalemi okuduysanız aşağıda paylaşacaklarım çok tanıdık gelecektir.

    Tahmin edebileceğiniz gibi her uygulamanın yaşam döngüsü bir tetikleme ile başlar. Bu tetikleme, aynı masaüstü uygulamalarında olduğu gibi, kullanıcının menüden uygulamanızı seçerek başlatmak istemesi olabileceği gibi bir başka uygulama içerisinde tıkladığınız bir link ya da bir başka aksiyon da olabilir. Bu tetiklemenin sonrasında ise bir Android uygulamasının yaşam döngüsü masaüstü uygulamalarıyla kıyaslandığında tamamen farklıdır. Bu farklılığın en temel nedeni Android işletim sisteminin çalıştığı neredeyse tüm sistemlerin mobil ve batarya ile beslenmesi. Dolayısıyla da masaüstünde çalışan bir uygulama gibi rahat sistem kaynaklarının kullanılması söz konusu olamaz; aslına bakarsanız yine bu düşük güç kaynağı nedeniyle kullanılan işlemci gücü dahi sınırlıdır. Böylesi bir durumda da uygulamanın yaşam döngüsünün kontrolü masaüstünden farklı olarak kullanıcıda değil işletim sistemindedir. Hatırlayacak olursanız bu durum aynı şekilde Windows 8 ile birlikte Windows Store uygulamaları için de geçerlidir.

    Bir Android uygulamasının yaşam döngüsüne bakacak olursak, dört durumda bulunabildiklerini görebiliriz; çalışıyor, askıda, arkaplanda ve çalışmıyor.

android-lifecycle

   Bu dört durumu inceleyecek olursak;

  • Çalışıyor (Active/Running) durumu adından da anlaşılacağı gibi uygulamanın yukarıda bahsettiğim tetikleyici bir olay ardında çalışarak kullanıcı ile etkileşim içinde olduğu durumdur. Bu durumdaki bir uygulama doğrudan kullanıcının gözü önünde olduğu için de Android işletim sistemince en yüksek öncelikle işletilmektedirler, sistem kaynakları öncelikle bu durumdaki uygulama tarafından kullanılmaktadır.
  • Askıda (Paused) durumu cihazın uyku durumuna geçmesi ya da uygulama arayüzünün ekranda görünür olmasına karşın aslında transparan bir başka aktivitenin çalışıyor durumda olması durumu için geçerlidir. Askında adı sizi şaşırtmasın, bu durumda bulunan uygulama  hala durum değişimlerinden haberdar olabilmektedir. Android işletim sistemi açısından ikinci en öncelikli uygulamalar askıda durumunda olanlardır.
  • Arkaplanda (Stopped/Backgrounded) durumu kullanıcının gözü önünde olmayan, aktif olarak kullanımda olmayan uygulamaların durumudur. Durmuş gözüyle de bakabileceğimiz bu uygulamalar yukarıda sıraladığım durumlarla kıyaslandığında Andorid işletim sistemince en düşük öncelikte olan uygulamalardır. Sistem kaynaklarının olası yetersizliği durumunda öncelikle arkaplanda durumunda olan uygulamalar sonlandırılacaktır.
  • Çalışmıyor (Destroyed) durumu için söylenecek çok fazla bir şey söz konusu değil. Adından da anlayabileceğiniz gibi hafızada dahi bulunmayan bu durumdaki uygulamalar hiç bir sistem kaynağını kullanamazlar.

   İşletim sistemince yönetilen durumlar arasındaki geçişler aktivite sınıflarımıza kalıtılan Activity sınıfı üye fonksiyonlarınca iletilmektedir. Örneğin; “Xamarin.Android : Merhaba” makalemde sizlerle paylaştığım uygulamanın arayüz tanımlamasını ve olay bildirimlerini dinlemeyi gerçekleştirdiğimiz OnCreate fonksiyonu uygulamanın ilklendirilmesi sırasında çağırılacaktır. Activity sınıfı içerisinde OnCreate dışında OnStart, OnRestart, OnResume, OnPause, OnStop, OnDestroy gibi diğer durum geçişlerini bildiren üye fonksiyonları da bulunmaktadır.

   Aşağıdaki grafikte durum yönetimi için kullanılan fonksiyonlar ile bu fonksiyonların Android işletim sistemince tetiklendiği durumları bulabilirsiniz;

android-activity-lifecycle

   Bir Android uygulamasının yaşam döngüsünün işletim sistemince yönetilmesi nedeniyle durum geçişleri arasında, örneğin sürdürülüyorken yok edilmesi, iş mantığınca oluşan verinin saklanması ihtiyacı ortaya çıkacaktır. Bunun ortak bir ihtiyaç olması nedeniyle, Activity sınıfı içerisine bu durumlarda çağırılacak OnSaveInstanceState ve OnRestoreInstanceState üye fonksiyonları yer almaktadır. Bu fonksiyonlardan;

  • OnSaveInstanceState fonksiyonu aktivitemiz yok edilmeden hemen önce çağrılarak uygulama verilerini saklamamıza olanak sunacaktır. Verilerimizi, bu fonksiyona parametre ile geçilen Bundle sınıf örneğine anahtar/değer ikilileri olarak saklayabiliriz.
  • OnRestoreInstanceState fonksiyonu aktivitemiz oluşturulduktan, OnCreate fonksiyon çağrısından hemen sonra çağrılacak ve sakladığımız uygulama verilerimizi okumamıza olanak sunacaktır. Verilerimiz, bu fonksiyona parametre ile geçilen Bundle sınıf örneğinde anahtar/değer ikilileri olarak gelecektir.

   OnCreate fonksiyonunu incelediyseniz fark etmişsinizdir; bu fonksiyon da Bundle sınıf örneğini parametre olarak kabul etmektedir. Bu sayede OnRestoreInstanceState çağrısını beklemeden, ilklendirme sırasında verilerimizi geri yüklememiz mümkün. Tüm arayüz ilklendirilmelerinin sonlanmasını gerektiren bazı istisnai geri yüklemeleri saymazsak, pek çok durumda OnRestoreInstanceState yerine OnCreate sırasında geri yükleme işleminizi yapmanız yeterli olacaktır.

   Durum yönetimi ile ilgili olarak düşmem gereken önemli bir not da verinin saklanması ile ilgili. Yukarıda belirttiğim iki fonksiyon ile veriyi saklama ve geri yüklemede Bundle’da anahtar-değer ikilisi olarak veri tutulması genellikle basit veri türleri için tavsiye edilen bir yöntem. Bitmap v.b. daha kompleks veri türlerinin saklanması/geri yüklenmesi için özel sınıfların kullanılması daha doğru olacaktır.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

1 Yorum

  1. Dilan YILMAZ   •  

    Merhaba,
    Sürekli olarak internet sitenizi takip ediyorum.Sizden bir okuyucunuz olarak ricam var; Android C# uygulamalarına dair bir kaç örnek paylaşır mısınız?
    Saygılarımla.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir